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