1

我有一个文件 test.txt,我想遍历它。一旦我把“here”字符串放在后面,我想在下面的行中放置“test”。

            $lines = array();
            $match = 'here';
            foreach(file('test.txt') as $line)
            {
            if((string)$match == (string)$line)
            {

                    array_push($lines, 'this');;
            }
            array_push($lines, $line);

不幸的是,即使 txt 文件中有一个“这里”,if 语句也永远不会解析为真。

谢谢

4

3 回答 3

1

如果您实际上并不关心逐行处理文本,您也可以使用正则表达式轻松完成此操作:

$text = file_get_contents('test.txt');
$text = preg_replace('/^(here)$/m', "\\1\ntest", $text);

这种类型的解决方案有几个您需要注意的要点:

  • 正则表达式需要在多行模式下使用(/m 修饰符)。
  • 匹配的文本放在括号内,以便我们可以在替换字符串中引用它。这样,您可以轻松地使用更复杂的表达式来匹配要在其后附加内容的行。
  • 如果您的输入文件没有 Unix 风格的换行符(实际上这意味着“如果它是由 Windows 应用程序创建的),那么您将不得不修改表达式以说明\r每个\n换行符之前的附加字符。一个有效的正则表达式对于 Unix 和 Windows 行尾都是

    $text = preg_replace("/^(here)(\r?\n)/m", "\\1\\2test\\2", $text);
    
于 2013-05-18T15:25:05.983 回答
1

归功于 Vedran Šego的评论

问题是它$line包含一个新行,所以要删除它,我们将使用trim()

编辑:此代码可能有几个问题,如下面Jon的评论中所述,我似乎误解了你想要做什么(而不是“添加”我替换了匹配的字符串)

foreach(file('test.txt') as $line){
   if($match === trim($line)){
      array_push($lines, 'this');
   }
   array_push($lines, trim($line));
}
于 2013-05-18T15:10:25.333 回答
1

以为我会提出我的解决方案:

$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);
  }
}
于 2013-05-18T16:03:30.853 回答