PHP遍历txt,一旦找到字符串,就插入文本

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) {

我有一个文件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文件中有一个“here”,if语句也永远不会解析为true

谢谢

学分来自他的。

问题是,
$line
包含一个新行,因此要删除它,我们将使用

编辑:此代码可能存在以下注释中所述的几个问题,并且我似乎误解了您的意图(而不是“添加”我替换了匹配的字符串)


如果您实际上不喜欢逐行处理文本,也可以使用正则表达式轻松地完成这项工作:

$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);
    

    • 我想我应该加入我的解决方案:

      $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);
        }
      }