为什么preg_replace()会将字符替换两次?

时间:2017-11-10 02:18:19

标签: php

我尝试使用preg_replace()更改一堆单词。我之所以使用preg_replace而不是strpos,是因为它可以搜索我要替换的同一个字符的多个场合。例如:

$word = "abadi";
$patterns = array("/a/","/b/","/d/","/i/","/I/");
$replacements = array(" A"," B"," D"," I"," IY");
$word = preg_replace($patterns, $replacements, $word);
var_dump ($word); // string ' A B A D  IY' (length=12)

我希望所有角色只更改一次。因此,一旦将小写字母i更改为I,请不要再将其更改为IY。有可能吗?

2 个答案:

答案 0 :(得分:1)

PHP的内置函数strtr更适合这种情况。替换子字符串后使用此函数,将不再搜索其新值。

$translations = ['a' => 'A', 'b' => 'B', 'd' => 'D', 'i' => 'I', 'I' => 'IY' ];
$newString = strtr('abadi', $translations);

参见定义:

string strtr ( string $str , array $replace_pairs )
  

如果给出两个参数,则第二个应该是表单数组中的数组(' from' =>' to',...)。返回值是一个字符串,其中所有出现的数组键都已被相应的值替换。将首先尝试最长的密钥。替换子字符串后,将不再搜索其新值。

strtr的更多详情,请参阅Documentation

答案 1 :(得分:0)

你可能需要考虑模式和替换数组的顺序,preg_replace word依次更新字符串,这样可能会有所帮助:

$word = "abadi";
$patterns = array("/I/", "/a/","/b/","/d/","/i/");
$replacements = array(" IY", " A"," B"," D"," I");
$word = preg_replace($patterns, $replacements, $word);
var_dump ($word);