str_replace只替换匹配单词

时间:2016-09-14 15:19:01

标签: php replace str-replace

我有这个PHP函数用我的列表文件替换文本中的单词

我的功能

function replace_text_wps($text){

$dir = plugin_dir_path( __FILE__ );
   $file= $dir."bad2.list";

$badlist = file($file, FILE_IGNORE_NEW_LINES);
$replace = '[censored]';

    $text = str_replace($badlist, $replace, $text);
    return $text;
}

例如我在bad2.list中有单词ABC

当我输入文字ABC时,我的功能将ABC更改为[审查],但如果我输入单词DFGABC将其更改为DFG [censored]

如何仅替换我文件中的匹配单词? 我是PHP新手?抱歉没有问题

更新

HD,谢谢!你的solution适合我!

这是工作版

function replace_text_wps($text){

$dir = plugin_dir_path( __FILE__ );
   $file= $dir."bad2.list";

$badlist = file($file, FILE_IGNORE_NEW_LINES);

$replacement = "[CENSORED]";
$badlist = array_map(function($v) { return "\b". $v ."\b"; }, $badlist);
foreach($badlist as $f) {
    $text = preg_replace("/".$f."/u", $replacement, $text);


    return $text;
}

4 个答案:

答案 0 :(得分:1)

这里有几个相互竞争的问题,其中一些问题由FluxCoders answer提出。

这是一个定义单词的案例,您可能认为"yes, this is a word"包含5个单词,但如果您使用空格系统来区分单词,例如

$badwords = array(" yes ", " this "); 
$text = "yes, this is a word"; 
print str_replace($badwords, "[censored]", $text);

输出为"yes, [censored] is a word";

因为 Spaces没有定义wordshapes ;单词可以包含在从新行字符\n到句号,各种标点符号以及甚至没有空格的任何内容中,尝试上面的相同系统但是:

$text = "this";

它不会取代有问题的词,因为这个词并没有整齐地包裹在每一面的空白处。

还有一些问题,例如你是否将连字符定义为分词?是"yes-sir"你想要替换"是"从?或者只有当是一个单一的措辞实体? ...这让我想起当我看到一个在线约会网站删除了“#34;鸡尾酒”这个词的时候。因为它包含一个粗鲁的词。

所以....我们怎么能这样做?

正则表达式匹配,使用PHP函数preg_replacereading this stack overflow question and answers。我不认为有必要重复这个问题,但是这篇文章更多的是概述了尝试使用简单的字符串替换函数进行正则表达式智能查找和替换的众多陷阱。

Regex Example

另请注意,您当前的功能 区分大小写,因此您不会匹配CaMelcaSe或CAPITALIZED版本的错误字词。

如果您决定不再轻松地在搜索中添加空格,您必须记住,您还需要添加相同的空格以保留替换文本的格式。

答案 1 :(得分:0)

你可以使用一个数组,所以如果你是bad2.list文件在每一行中都包含所有'坏'字,所以就像每行一个字一样,你可以这样做:

$file = file_get_contents("bad2.list"); //Should be a .txt....
$words = explode("\n", $file); //Explodes into a Array on each new line.

$message = "DFGABC";

foreach($words AS $word){
    $message = str_replace($word, "[censored]", $message);
}

echo $message;

可能的解决方法是在您要审核的字词之后添加空格,或者您可以通过在$word = $word.' ';

之前添加str_replace();来自动执行此操作

以下内容可按您的要求使用。

答案 2 :(得分:0)

您可以使用preg_replace()代替

$replace = '[censored]';

    $text = preg_replace("/\b$text\b/", $replace, $badlist);
    return $text;

答案 3 :(得分:0)

更新

https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html,谢谢!你的HD适合我!

这是工作版

{{1}}