我有一个如下文本文件:
yyy.txt:
line1
line2
line3line4
line5line3
line3
现在,我想在下面的代码中将line3
替换为555
。但是,如果line3
不是另一个字的一部分,我只想替换该行,例如XYline3
或line3XY
。
我尝试使用此代码完成此操作:
$filename="yyy.txt";
$line="line3";
file_put_contents($filename, str_replace($line , "555", file_get_contents($filename)));
输出:
line1 line2 555line4 line5555 555
正如你在这里看到的那样,它也取代了line3line4
和line5line3
,即使我不想要这个。
那么如何更改当前代码,如果它不是另一个单词的一部分,它只会替换搜索词?我有点卡在这里,不确定str_replace()
是否可行,或者我是否必须以其他方式进行此操作。
答案 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$
modifier的m
等正则表达式只能找到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)
首先,您的数据应该更清晰,您的问题应该更有条理,无论如何,
使用以下脚本:
$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));