如何在不重叠结果的情况下替换字符串中的多个字符串?

Rya*_*yan 6 php regex replace preg-replace str-replace

我正在尝试从字符串创建常见的掩码,如下所示:

012abc.d+e_fg~hijk => 012{start}.d+{middle}_fg~{end}jk
Run Code Online (Sandbox Code Playgroud)

更换:

$arrFromTo = array(
              'st' => '{pre}',
              'abc' => '{start}',
              'e' => '{middle}',
              'hi' => '{end}',
              'dd' => '{post}'
             );
Run Code Online (Sandbox Code Playgroud)

相反,我保持重叠的替换,并得到这样的东西(使用循环的str_replace's):

012{{pre}art}.d+{mi{post}le}_fg~{end}jk
Run Code Online (Sandbox Code Playgroud)

因为st在已经被替换的中发现{start}并且dd被发现{middle}.

你会如何取代以下?

$str = 'abc.d+e_fg~hijk';

echo replace_vars($str); // Desired output: 012{start}.d+{middle}_fg~{end}kJ
Run Code Online (Sandbox Code Playgroud)

Rud*_*die 6

我可能会误解,但你似乎不需要正则表达式替换.它们是简单的,字面上的替代品.

$from = '012abc.d+e_fg~hijk';
$arrFromTo = array(
              'st' => '{pre}',
              'abc' => '{start}',
              'e' => '{middle}',
              'hi' => '{end}',
              'dd' => '{post}'
             );
$to = strtr($from, $arrFromTo); // 012{start}.d+{middle}_fg~{end}jk
Run Code Online (Sandbox Code Playgroud)

strtr()太棒了.它需要一个非常易读的输入,它不会像循环中的问题那样重新替换.