用 php 覆盖包含特定用户名的文本文件中的一行


Overwrite a line in a text file containing a certain username with php

我在这个网站上看到了很多关于覆盖文本文件的例子,但找不到针对这种特定情况的解决方案。我正在使用php和txt文件编写一个小脚本来存储一些数据。

我有以下纺织品:

<div class="chatmsg"><b>John</b>: sfdfsdfd<br/></div>
<div class="chatmsg"><b>Jane</b>: dd<br/></div>
<div class="chatmsg"><b>John</b>: sdsd<br/></div>
<div class="chatmsg"><b>Jane</b>: sf<br/></div>
<div class="chatmsg"><b>Bob</b>: dsf<br/></div>
<div class="chatmsg"><b>Jane</b>: df<br/></div>

这是使用添加一行的 php 文件创建的:

if(!empty($name) && !empty($msg)){
    $fp = fopen($chatroom."_chat.txt", 'a');  
     fwrite($fp, '<div class="chatmsg"><b>'.$name.'</b>: '.$msg.'<br/></div>'.PHP_EOL);  
    fclose($fp);   
}

一段时间后,这个文件会变得很大。我可以删除该文件,但我想在这里尝试不同的方法。

假设 3 个人添加了一行,文本文件是这样的:

<div class="chatmsg"><b>John</b>: sdsd<br/></div>
<div class="chatmsg"><b>Jane</b>: sf<br/></div>
<div class="chatmsg"><b>Bob</b>: dsf<br/></div>
目前,新

条目将在文本文件中添加一行,但是否也可以用新消息覆盖 Bobs 以前的消息?如果是这样,该怎么做?这样我使文本文件保持较小(因此除非一个全新的人输入一行,否则不会再添加行)

多谢

PHP不是我的强项,但嘿,你有一个公开的赏金,所以我决定试一试。如果您想继续使用当前的 IO 方法,也许可以切换到在 XML 文件中使用一些结构化数据而不是纯文本。如果要切换到 XML,则可以根据需要查询和删除或修改节点。下面是一个帮助您入门的简单示例。此示例删除包含"John"值的节点。

// http://php.net/manual/en/domdocument.load.php
//<?xml version="1.0" encoding="utf-8" ?>
//<root>
//<div class="chatmsg"><b>John</b>: sfdfsdfd<br/></div>
//<div class="chatmsg"><b>Jane</b>: dd<br/></div>
//<div class="chatmsg"><b>John</b>: sdsd<br/></div>
//<div class="chatmsg"><b>Jane</b>: sf<br/></div>
//<div class="chatmsg"><b>Bob</b>: dsf<br/></div>
//<div class="chatmsg"><b>Jane</b>: df<br/></div>
//</root>
<?php
$doc = new DOMDocument();
$doc->load("chat.xml");
$xpath = new DOMXpath($doc);
$html = $doc->documentElement;
$elements = $xpath->query("//div[contains(b,'John')]");
if ($elements->length) {
    $html->removeChild($elements);
}
$doc->save("chat.xml");
?>

谢谢大家,我在这里找到了答案:如何使用 php 替换文本文件中的特定行?

关于数据库答案,是的,数据库更好,但我想使用 SSE,但我还没有找到 mysql 和 SSE 的工作示例。我想推送数据和我发现的所有示例,其中使用某种轮询或每 3 秒检查一次新数据解决方案。

如果有人有一个教程或例子证明它可以做到,我真的很想看看(然后我需要升级我的谷歌技能,因为我什么也没找到)