PHP遍历txt,一旦找到字符串,就插入文本
我有一个文件test.txt,我想遍历它。一旦我读入“here”字符串,我想在下面一行中放置“test”PHP遍历txt,一旦找到字符串,就插入文本,php,arrays,Php,Arrays,我有一个文件test.txt,我想遍历它。一旦我读入“here”字符串,我想在下面一行中放置“test” $lines = array(); $match = 'here'; foreach(file('test.txt') as $line) { if((string)$match == (string)$line) {
$lines = array();
$match = 'here';
foreach(file('test.txt') as $line)
{
if((string)$match == (string)$line)
{
array_push($lines, 'this');;
}
array_push($lines, $line);
不幸的是,即使txt文件中有一个“here”,if语句也永远不会解析为true
谢谢
学分来自他的。
问题是,$line
包含一个新行,因此要删除它,我们将使用
编辑:此代码可能存在以下注释中所述的几个问题,并且我似乎误解了您的意图(而不是“添加”我替换了匹配的字符串)
如果您实际上不喜欢逐行处理文本,也可以使用正则表达式轻松地完成这项工作:
$text = file_get_contents('test.txt');
$text = preg_replace('/^(here)$/m', "\\1\ntest", $text);
这种类型的解决方案有几个要点需要注意:
- 正则表达式需要在多行模式下使用(
)/m
- 匹配的文本放在括号内,以便我们可以在替换字符串中引用它。通过这种方式,您可以轻松地使用更复杂的表达式来匹配要在后面追加内容的行
- 如果您的输入文件没有Unix样式的行尾(实际上,这意味着“如果它是由Windows应用程序创建的”),则必须修改表达式,以说明每个
换行符之前的附加\r
字符。适用于Unix和Windows行尾的正则表达式是\n
$text = preg_replace("/^(here)(\r?\n)/m", "\\1\\2test\\2", $text);
- 我想我应该加入我的解决方案:
$text = file_get_contents('test.txt');
$lines = explode("\n", $text);
$match = 'here';
foreach ($lines as $idx => $line) {
if (trim($line) === $match) {
array_splice($lines, $idx, 0, $line);
}
}
每个
$line
末尾都有一个新行,而您的$match
没有新行。因此,让我这样来理解,您有一个名为test.txt的文件,其中有一个单词在这里
,您只需打开该文件,并将该单词在这里
替换为此
。如果($match==trim>,请尝试(美元行))
谢谢Hamza。回答问题,这样我就可以给你评分了。是的@HamZaDzCyberDeV我需要给你一些评分工具ol,我打算编辑我的答案,添加以下内容:D注意,当此处的位于最后一行时,第二个正则表达式将失败,因为后面没有新行it@HamZaDzCyberDeV:那是真的!我不知道该怎么修以一种平台不可知的方式……我想了一会儿,想到了一个主意,使用PHP_EOL
:$output=preg_replace(“/^(此处)(\r?\n |$)/m“,“\\1”。PHP_EOL。“test”。PHP_EOL,$text);
。@HamZaDzCyberDeV:The“问题”“这样一来,它将换行符更改为当前平台的定义。我认为,如果不诉诸preg_replace_callback
,就不可能以正确和平台无关的方式执行此操作。这是一个很好的实用解决方案,但有几个小细节需要妥善解决。1)编写的代码不插入内容,而是替换内容。2)如果行的开头或结尾有空格,则将忽略该行。因此,一行“here”(开头的空格)将触发替换;不清楚这是否是故意的。值得注意的是,如果$lines[]=$line
是一个数字字符串,如“007”
,则该代码将在转换为该数字的所有行上触发,如07
。为了防止这种情况发生,您需要使用==
进行比较,可能还需要转换为字符串进行良好的度量。很好,如果您想避免正则表达式heh,我会使用preg\u split(\r\n?|\n“,$text)
或explode(\n”,str\u replace(“\r“,”,$text))
!
$text = file_get_contents('test.txt');
$lines = explode("\n", $text);
$match = 'here';
foreach ($lines as $idx => $line) {
if (trim($line) === $match) {
array_splice($lines, $idx, 0, $line);
}
}