尝试用相同的搜索字符替换部分字符串

时间:2015-03-25 08:57:45

标签: php regex str-replace

我正在尝试替换部分字符串。但是当我的搜索字符串以相同的字符开头时,我遇到了一个问题:

$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()来正确匹配单词。

3 个答案:

答案 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

Try it

答案 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

相关问题