这应该对你有用
$arrWords = array(
"cat" => "dog",
"dog" => "mouse",
"phone" => "book"
);
$txttest = "My catalogue has a cat and a phone";
$stringArr = explode(' ',$txttest);
foreach($stringArr as $k=>$v){
if(array_key_exists($v,$arrWords)){
$stringArr[$k]=$arrWords[$v];
}
}
echo implode(' ',$stringArr);
编辑
根据给定情况替换字符串
My catalog has a cat and a phone
使用以下数组匹配键并替换为相应的值
$arrWords = array(
"cat" => "dog",
"dog" => "mouse",
"phone" => "book"
);
由于存在与键匹配的特定值,如果我们在上述数组的 for 循环中使用 preg_replace,我们的替换字符串很可能会相互替换,
可能的嫌疑人("cat" => "dog","dog" => "mouse")
在这种情况下,一个更好的选择是preg_replace_callback 和word boundary \b,因为除了\t 或任何其他单词之外,字符串中也可能有特殊字符。
所以理想情况下,上面提供的原始解决方案不应该(实际上永远不会)被使用,也不是真正的解决方案,因为当有特殊字符时它会失败。
实际上应该做的是首先创建一个正则表达式
应该使用单词边界,其中包含一个捕获组
所有要匹配的单词作为替代词(使用 OR 运算符)。
因此,如果我将上述语句转换为正则表达式,请记住给定的搜索和替换数组 $arrWords,它会是这样的。
/\b(cat|dog|phone)\b/gi
g 修饰符最后是确保所有匹配的global pattern flag(在第一次匹配后不返回)和i 用于不区分大小写的匹配。在preg_replace_callback()函数中使用时可以省略g修饰符,因为这个函数的第四个参数会处理它。
因此,如果我将 regex 添加到任何在线正则表达式实用程序并提供类似
的字符串
My catalog has a cat cat cat cat a\tdog and a phone
(请注意,使用在线实用程序将字符串写入在线正则表达式编辑器以将其检测为特殊字符或 \t 时,您应该删除带有实际 TAB 的 \t)
它将突出显示所有找到的匹配项,如下所示
我的目录有 cat cat cat cat dog 和 phone
(a 后面的空格是因为TAB)
现在需要替换它们,替换后上述语句应转换为
My catalog has a dog dog dog dog a mouse and a book
所以现在出现了preg_replace_callback() 和回调函数,它可以完成替换的技巧,同时还要注意不交换/替换替换键。
$r = preg_replace_callback(
"/\b(".implode("|",array_keys($arrWords)).")\b/i",
function($matchingPharse) use ($arrWords) {
return strtolower($arrWords[strtolower($matchingPharse[0])]);
},
$txttest
);
我们在这里所做的是,在第一个参数中,我们通过使用array_keys() 从给定数组中提取字符串中要匹配的单词来制作相同的regex,因为preg_replace_callback() 找到了匹配项字符串中的单词,它将它们传递给第二个参数中的callable anonymous function,并返回替换数组$arrWords中那些匹配项的替换单词只有一件事是use关键字,因为我们需要访问@987654359 @array 并从匹配的键返回相应的值,并且回调函数只有一个参数matches,因此将多个参数传递给回调函数的最简单方法是使用 'use' 关键字。我从 here 在用户贡献的注释部分得到了关于它的想法。
所以上面会输出
我的目录有一只狗狗狗一只老鼠和一本书
如果我们需要检查它是否保持不区分大小写,我们需要添加i 提要
输入
The cat's mouse(named Mouse), cat (named Cat), and dog (named Giraffe) are in this catalog.
输出
The dog's mouse(named Mouse), dog (named dog), and mouse (named Giraffe) are in this catalog.
资深会员提供的另一个案例是
$arrWords=["cat"=>"dog","dog"=>"mouse","mouse"=>"Mickey"];
输入
The cat's mouse(named Mouse), cat (named Cat), and dog (named Giraffe) are in this catalog.
输出
The dog's mickey(named mickey), dog (named dog), and mouse (named Giraffe) are in this catalog.
我与社区的一位高级成员进行了讨论,他指导我了解原始答案中错误信息的严重性,这些错误信息可能会将其他人引向错误的方向,而 SO、我或该社区的任何其他成员都不打算这样做这样做,所以我试图改进答案,如果他打算使用我以前的答案,他会要求 OP 所有者遵循这种方法。我很抱歉一开始就提供了一个糟糕的解决方案。