В этой заметке расскажу не про какой-то готовый класс или функцию, а скорее про прием, которым можно воспользоваться, для достижения желаемого результата.
В одной моей статье про синонимизацию текста, алгоритм уперся в то, что все функции кроме 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
Весьма и весьма полезный на мой взгляд приемчик. Это может пригодиться не только в синонимизаторе, но и к примеру в шаблонизаторе. Это ведь проще, чем купить блок питания для ноутбуку, Вам так не кажется!? Ведь можно просто перейти на сайт с сделать это.