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

I try to change a bunch of words using preg_replace(). The reason I use preg_replace as opposed to strpos, because it can search for multiple occasions of the same character that I want to replace. For example:

$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 want all the characters are changed once only. So once the lowercase i has been changed to I, don't change it again to IY. Is it possible?

PHP's builtin function strtr is more suitable to this scenario. Using this function once a substring has been replaced, its new value will not be searched again.

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

See the definition:

string strtr ( string $str , array $replace_pairs )

If given two arguments, the second should be an array in the form array('from' => 'to', ...). The return value is a string where all the occurrences of the array keys have been replaced by the corresponding values. The longest keys will be tried first. Once a substring has been replaced, its new value will not be searched again.

More details of strtr, please see the Documentation.

you may need to consider the order of patterns and replacements array, preg_replace word sequentially on updated string so this might help:

$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);