1

为什么这段代码

 $my_replacements = array("my dog", "doga");
 $my_string = "doga my dog test";
 $my_patterns = array_map(function($my_text) { return "/(^|[\n\r\f\t \.\,])" . trim($my_text) . "([\n\r\f\t \.\,]|$)/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,因为子字符串可能是大写的,并且必须以任何一种方式将其删除。

4

2 回答 2

2

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

/(^|[\n\r\f\t \.\,])my dog([\n\r\f\t \.\,]|$)/iu
/(^|[\n\r\f\t \.\,])doga([\n\r\f\t \.\,]|$)/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

于 2012-11-29T10:23:30.687 回答
1

为什么不使用 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);
然后用一个空格修剪和替换所有多个空格(简单的递归替换)。

于 2012-11-29T10:37:02.213 回答