В этой заметке расскажу не про какой-то готовый класс или функцию, а скорее про прием, которым можно воспользоваться, для достижения желаемого результата.
В одной моей статье про синонимизацию текста, алгоритм уперся в то, что все функции кроме strtr каждый раз заменяют текст, и обновляют его. Следующую замену они уже делают с обновленным текстом. Проиллюстрирую на примере
$str = 'мама мыла раму, а дочка балкон';
echo str_replace(array('мама','дочка'),array('дочка','бабушка'),$str);
//бабушка мыла раму, а бабушка балкон
echo preg_replace(array('#мама#u','#дочка#u'),array('дочка','бабушка'),$str);
//бабушка мыла раму, а бабушка балкон
echo strtr($str,array('мама'=>'дочка','дочка'=>'бабушка'));
//дочка мыла раму, а бабушка балкон
Как можете видеть, верным является лишь третий вариант. Но возможности strtr сильно ограничены, как научить preg_replace работать также, как и strtr
Для этого нам потребуется preg_replace_callback. В ней производим замену, но не обычную, а меняем текст на его md5 хеш, а пару хеш значение, сохраняем в массиве.
$str = 'мама мыла раму, а дочка балкон';
$replace = array('мама'=>'дочка','дочка'=>'бабушка');
$hash = array();
foreach($replace as $key=>$value){
$str = preg_replace_callback('#'.$key.'#ui',function($match)use(&$hash,$value){
$md = md5($value);
$hash[$md] = $value;
return $md;
},$str);
}
echo strtr($str,$hash);
//дочка мыла раму, а бабушка балкон
По завершении цикла, пользуемся strtr
Весьма и весьма полезный на мой взгляд приемчик. Это может пригодиться не только в синонимизаторе, но и к примеру в шаблонизаторе. Это ведь проще, чем купить блок питания для ноутбуку, Вам так не кажется!? Ведь можно просто перейти на сайт с сделать это.

