如何用str_replace()替换一个术语,前提是它不是另一个单词的一部分


How to replace a term with str_replace(), only if it is not part of another word?

我有一个文本文件,如下所示:

yyy.txt:

line1                     
line2                      
line3line4    
line5line3    
line3

现在我想在下面的代码中用555替换line3。但我只想在line3不是另一个单词的一部分的情况下替换这行,例如XYline3line3XY

我试图用这个代码来实现这一点:

$filename="yyy.txt";
$line="line3";
file_put_contents($filename, str_replace($line , "555",  file_get_contents($filename)));

输出:

第1行第2行555第4行第5行555555

正如你在这里看到的,它也取代了line3line4line5line3,尽管我不想要这个。

那么,我如何更改我的当前代码,使其仅在搜索词不属于另一个单词的情况下替换它呢?我有点被困在这里,不确定str_replace()是否可能,或者我是否必须用另一种方式来做。

使用preg_replace:

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

这将替换句子中与line3匹配的所有单词。

要精确匹配,请使用:/^line3$/m

^line3$这样带有m修饰符的正则表达式只能查找line3行。CCD_ 14使CCD_。

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

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

在正则表达式中,^匹配一行的开头,line3匹配第3行,'s*匹配零个或多个空格/制表符,$匹配该行的末尾。开关gm意味着处理所有匹配,并将字符串视为多行。

首先,你的数据应该更干净,你的问题应该更有条理,无论如何,

  1. 打开您的文本文件,并确保在在每行的末尾,单击每行的末尾
  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));