我正在尝试替换部分字符串。但是当我的搜索字符串以相同的字符开头时,我遇到了一个问题:
$string = "Good one :y. Keep going :y2";
$str = str_replace(array_keys($my_array), array_values($my_array), $string);
$my_array= array(":y" => "a", ":y2" => "b");
输出中:
Good one a. Keep going a2
我需要str_replace()
来正确匹配单词。
答案 0 :(得分:2)
除此之外,您应该在使用之前先定义数组,这应该适合您:
$str = strtr($string, $my_array);
你的问题是str_replace()
遍历整个字符串并替换它所能做的一切,你也可以在手册中看到这一点。
从那里引用:
因为str_replace()替换从左到右,所以可能会在执行多次替换时替换先前插入的值。另请参阅本文档中的示例。
所以为此,我在这里使用了strtr()
,因为它首先尝试匹配搜索中的最长字节。
您也可以在手册中阅读此内容并从中引用:
如果给出两个参数,则第二个应该是表单数组中的数组(' from' =>' to',...)。返回值是一个字符串,其中所有出现的数组键都已被相应的值替换。 首先尝试最长的密钥。替换子字符串后,将不再搜索其新值。
答案 1 :(得分:1)
尝试先替换:y2
,然后替换:y
$string = "Good one :y. Keep going :y2";
$my_array= array(":y2" => "b", ":y" => "a");
$str = str_replace(array_keys($my_array), array_values($my_array), $string);
输出
Good one a. Keep going b
答案 2 :(得分:0)
:y\b
使用此选项仅替换:y
而非:y2
。请参阅演示。
https://regex101.com/r/sJ9gM7/9
$re = "":y\\b"m";
$str = "Good one :y. Keep going :y2\n";
$subst = "a";
$result = preg_replace($re, $subst, $str);
同样适用于:y2
使用:y2\b
。