用 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>
目前,新条目会在文本文件中添加一行,但是否也可以用新消息覆盖 Bob 之前的消息?如果是这样,该怎么做?这样我就可以保持文本文件很小(所以不会添加更多的行,除非一个全新的人输入一行)
非常感谢
谢谢大家,我在这里找到了答案:how to replace a particular line in a text file using php?
关于数据库的答案,是的,数据库更好,但我想使用 SSE,但我还没有找到 mysql 和 SSE 的工作示例。我想推送数据和我发现的所有示例,这些示例使用某种轮询或每 3 秒检查一次新数据解决方案。
如果有人有教程或例子证明可以做到,我真的很想看看(然后我需要升级我的 google 技能,因为我什么也没找到)
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 和一个 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>
目前,新条目会在文本文件中添加一行,但是否也可以用新消息覆盖 Bob 之前的消息?如果是这样,该怎么做?这样我就可以保持文本文件很小(所以不会添加更多的行,除非一个全新的人输入一行)
非常感谢
谢谢大家,我在这里找到了答案:how to replace a particular line in a text file using php?
关于数据库的答案,是的,数据库更好,但我想使用 SSE,但我还没有找到 mysql 和 SSE 的工作示例。我想推送数据和我发现的所有示例,这些示例使用某种轮询或每 3 秒检查一次新数据解决方案。
如果有人有教程或例子证明可以做到,我真的很想看看(然后我需要升级我的 google 技能,因为我什么也没找到)
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");
?>