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