Preg 替换为未按预期工作的模式数组



为什么这段代码会

 $my_replacements = array("my dog", "doga");
 $my_string = "doga my dog test";
 $my_patterns = array_map(function($my_text) { return "/(^|[nrft .,])" . trim($my_text) . "([nrft .,]|$)/iu"; }, $my_replacements);
 $replaced_string = preg_replace($my_patterns, '', $my_string);
 echo $replaced_string;

返回dogatest而不是test

但是如果my_string更改为"my dog doga test",它会正确替换my_replacements中的两个元素?

我想要完成的是,给定一个字符串,找到 $my_replacements 中的所有字符串并将它们从字符串中删除。 考虑到/u 修饰符和/i 修饰符或preg_replace,因为子字符串可能是大写的,并且必须以任何一种方式删除它。

因为您的替换将转换为以下正则表达式:

/(^|[nrft .,])my dog([nrft .,]|$)/iu
/(^|[nrft .,])doga([nrft .,]|$)/iu

在第一个正则表达式应用于源字符串"my dog doga test"后 - 它会切断周围带有空格dog doga。所以你得到dogatest.

之后,第二个正则表达式无法匹配任何内容,因为它希望doga由字符串的开头或结尾、空格或标点符号括起来。但在您的情况下,它位于字符串的开头 ( true ),但在 ( false 之后没有空格、标点符号或字符串结尾。

这就是为什么第二个正则表达式不会修改字符串并且最终结果dogatest

没有正则表达式的简单解决方案:

 $my_replacements = array("my dog", "doga");
 $my_string = "doga my dog test";
 $replaced_string = str_replace($my_replacements, '', $my_string);
 echo $replaced_string;

@Asad创建了脚本的代码板演示:http://codepad.org/ywbZR1i8

你不使用str_replace有什么原因吗?如果是,您可以使用
$my_replacements = array("doga", "my dog"); 而不是
$my_replacements = array("my dog", "doga");
原因:在字符串中的"doga"替换为"后,这将成为"dogatest"。因此,带有空格的 doga(如您定义的常规 exp)不存在。您也可以用" "代替 '',
替换 $replaced_string = preg_replace($my_patterns, ' ', $my_string); 然后修剪并用一个空格替换所有多个空格(一个简单的递归替换)。