如何用str_replace()替换一个术语,只要它不是另一个词的一部分?

时间:2015-12-29 05:00:04

标签: php file str-replace

我有一个如下文本文件:

yyy.txt:

line1                     
line2                      
line3line4    
line5line3    
line3

现在,我想在下面的代码中将line3替换为555。但是,如果line3不是另一个字的一部分,我只想替换该行,例如XYline3line3XY

我尝试使用此代码完成此操作:

$filename="yyy.txt";
$line="line3";

file_put_contents($filename, str_replace($line , "555",  file_get_contents($filename)));

输出:

line1

line2

555line4

line5555

555

正如你在这里看到的那样,它也取代了line3line4line5line3,即使我不想要这个。

那么如何更改当前代码,如果它不是另一个单词的一部分,它只会替换搜索词?我有点卡在这里,不确定str_replace()是否可行,或者我是否必须以其他方式进行此操作。

4 个答案:

答案 0 :(得分:4)

使用preg_replace

$line="/\bline3\b/";    
file_put_contents($filename, preg_replace($line , "555",  file_get_contents($filename)));

这将替换句子中匹配line3

的所有字词

要完全匹配,请使用:/^line3$/m

答案 1 :(得分:3)

使用^line3$ modifierm等正则表达式只能找到line3行。 m使每行^$匹配。

https://regex101.com/r/xT7bS3/1

PHP用法:

<?php
$string = 'line1

line2

line3line4

line5line3

line3';
echo preg_replace('/^line3$/m', '555', $string);

PHP演示:https://eval.in/494548

答案 2 :(得分:0)

file_put_contents($filename, preg_replace(
    "/^line3\s*$/gm" ,
    "555",
    file_get_contents($filename)
));

在常规快递中,^匹配一行的开头,line3匹配,第3行,\s*匹配零个或多个空格/标签,$匹配行尾。开关gm表示处理所有匹配并将字符串视为多行。

答案 3 :(得分:0)

首先,您的数据应该更清晰,您的问题应该更有条理,无论如何,

  1. 打开文本文件,确保其中有一个RC字符 每行的结尾,您将通过单击输入来完成此操作 每行结束。
  2. 使用以下脚本:

    $filename="yyy.txt";
    $content = file_get_contents($filename);
    $content =  preg_replace ('/(\r)+line3(\r)+/', "\r555\r" , $content);
    $content =  preg_replace ('/(\n)+line3(\n)+/', "\n555\n" , $content);
    file_put_contents($filename, preg_replace ('/(\s)+line3(\s)+/', "\s555\s" , $content));