【问题标题】:Replace line in text file using PHP [closed]使用 PHP 替换文本文件中的行 [关闭]
【发布时间】:2013-09-30 06:33:27
【问题描述】:

我有一个包含以下数据的文本文件:

1_fjd
2_skd
3_fks

我想用 php 替换我的文本文件中的一部分。例如我想这样做:

找到以“2_”开头的行并将其替换为“2_word”,因此“2_”之后的所有内容都将替换为:“word”。我如何在 php 中做到这一点?

【问题讨论】:

  • 尝试自己编写一些东西,如果不起作用,具体向我们展示你所做的事情,以便我们为你提供帮助。您启动它,我们提供帮助。我们不是为你写的。向我们展示您尝试过的实际代码,然后我们可以从那里帮助您。如果您先自己尝试一下,您可能会非常接近答案。
  • 为什么要搁置?这是一个不错的问题,只是写得不好。推荐 OP 编辑​​他的问题。
  • 注意:这种情况下的困难不是字符串 ops,而是明显就地编辑文件的问题。有几种方法可以近似它,它们都不难,但对于初学者来说也不是很简单。但事实上,实际上没有办法真正“就地”编辑文本文件(尽管有 fseekfwrite,你最终只会创建一个新文件并摆脱旧的,以某种方式)通常不会立即沉入其中。 (这也让我感到有些不适。)
  • exec 粉丝sed -i "s/2=.*/2=word/" file.txt

标签: php regex replace


【解决方案1】:

您不需要正则表达式。请尝试以下操作:

  • 使用file() 将文件加载到数组中并遍历行
  • 检查字符串是否以2_开头
  • 如果是这样,请将其替换为输入 $word 并将其连接到 $result 字符串
  • 如果没有,只需将其连接到$result 字符串
  • 使用file_get_contents()并将结果写入文件

代码:

$lines = file('file.txt');
$word = 'word';
$result = '';

foreach($lines as $line) {
    if(substr($line, 0, 2) == '2_') {
        $result .= '2_'.$word."\n";
    } else {
        $result .= $line;
    }
}

file_put_contents('file.txt', $result);

现在,如果发生了替换,那么file.txt 将包含如下内容:

1_fjd
2_word
3_fks

【讨论】:

  • @lok​​o:我认为这个问题那么不好。我假设 OP 是初学者,所以我也添加了解释,而不仅仅是代码转储。
  • 我并不是说这个问题不好。即使您假设 OP 是初学者,也不知道他是否会理解其中的任何内容。好吧,使用或不使用它是他的选择。
  • @lok​​o: Assume good faith :)
【解决方案2】:

文件:

1_fjd
2_skd
1_fff

调用:

replaceInFile("1_", "pppppppppp", "test.txt");

输出:

1_pppppppppp
2_skd
1_pppppppppp

功能:

function replaceInFile($what, $with, $file){
    $buffer = "";
    $fp = file($file);
    foreach($fp as $line){
        $buffer .= preg_replace("|".$what."[A-Za-z_.]*|", $what.$with, $line);
    }
    fclose($fp);
    echo $buffer;
    file_put_contents($file, $buffer);
}

PS:只有在 $what 之后只有 a 到 Z 的字母时才有效。如果要支持更多字符,则必须更改 preg_replace 模式。

【讨论】:

    【解决方案3】:

    好的,我自己只用了 3 行代码就完成了这个。我不会发布它,因为你不会从中学习。我会告诉你你需要什么。 explode(表示必须替换第一个 _ 之后的所有内容)和 str_replace(替换当然)只需阅读手册,您将能够理解它。祝你好运

    编辑: 当然还有:fopen

    【讨论】:

    • 太糟糕了,真的很想从中学习。
    • 顺便说一句,OP 没有排除 CLI SAPI,所以这里有一个近似值(使用正则表达式以获得更多用处):php -R 'echo preg_replace("/(2_).+/", "$1word", "$argn\n");' <old.txt >new.txt
    • @Sz。由于这篇文章是 2 年前发布的(当我开始使用 SO 时)。我现在看到这个答案没有提供足够的信息来成为一个好的答案,但是我仍然坚持我的决定,即不实际发布我制作的 3 行脚本,因为链接(和我的解释)应该制作完全相同的脚本。跨度>
    • @Loco,很公平。我只是跟进了谷歌员工,他们随机过来喝点果汁,就像我最终来到这里一样。 (顺便说一句,从真正的 PHP 代码中,您不能只从 cmd 中执行相同的操作。)
    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2011-11-21
    • 2021-07-28
    • 1970-01-01
    • 2014-06-05
    相关资源
    最近更新 更多