Продожение темы синонимайзера на php В этой заметке расскажу не про какой-то готовый класс или функцию, а скорее про прием, которым можно воспользоваться,  для достижения желаемого результата.

В одной моей статье про синонимизацию текста, алгоритм уперся в то, что все функции кроме 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

Весьма и весьма полезный на мой взгляд приемчик. Это может пригодиться не только в синонимизаторе, но и к примеру в шаблонизаторе. Это ведь проще, чем купить блок питания для ноутбуку, Вам так не кажется!? Ведь можно просто перейти на сайт с сделать это. 

Рассказать друзьям

Добавить комментарий


Защитный код
Обновить