При написании одной доски объявлений, заказчик, как водиться, попросил написать парсер объявлений с известных досок.
На современном уровне развития антиспам систем, сграбить новые объявления не так и просто с задачей я справился. Пришлось применить парочку хитрых приемов с COM объектом Интернет Эксплорера. Но сейчас не про это.
Грош цена такому тексту для поисковых систем. Ведь текст не уникальный, а значит надо сделать так, чтобы он стал уникальным.
Простейшая замена одного слоа на другое по базе не составит труда для php. Ведь php это текстовый язык программирования, созданный для текстовых вычислений и преобразований. Грубо говоря php это просто шаблонизатор. Но я опять отвлекся.
В php есть множество функций для замены одного слова на другое. Рассмотрим несколько из них.
Функция, которая первой приходит в голову это strtr
<?php
$a = strtr( 'Мобильный телефон Samsung обменяю на новый iphone' ,array(
'Мобилный телефон'=>'Мобильник',
'Samsung'=>'Самсунг', 'новый'=>'новенький','обменяю'=>'поменяю',
'Iphone'=>'Айфон'));
// Мобильник Самсунг поменяю на новенький Айфорн
удобно, но не совсем. Функция чувствительна к регистру. Значит Samsung и samsung это разные слова.
Но я вновь отвлекся.
У большинства текстовых функций php, есть регистронезависимый аналог с буквой i по середине, обычно он не дружит с utf-8. Но у strtr его нет.
Пожалуй единственная функция, которая корректно работает с utf-8 и регистронезависема это preg_replace
Разумеется, нужно указывать верные флаги iu - i - регистр неважен, u - работаем с utf-8
Перепишем верхний код
<?php
$a = preg_replace(
array('#мобилный телефон#ui','#samsung#ui', '#новый#ui','#Обменяю#ui','#Iphone#ui'),
array('Мобильник','Самсунг','новенький','поменяю','Айфон'),
'Мобильный телефон Samsung обменяю на новый iphone');
// Мобильник Самсунг поменяю на новенький Айфорн
Уже более приемлемо. Но, вот хранить массив ключей в таком виде не очень удобно.
Поэтому я написал вот эту функцию
function _strtr($str,$repl_array){
$keys = array_map(function($key){
return '#'.$key.'#ui';
},array_keys($repl_array));
$values = array_values($repl_array);
return preg_replace($keys,$values,$str);
}
echo _strtr('Мобильный телефон Samsung обменяю на новый iphone',
array(
'мобильный телефон'=>'Мобильник',
'samsung'=>'Самсунг', 'новый'=>'новенький','обменяю'=>'поменяю',
'Iphone'=>'Айфон'
)
);
Вот так и творится история ;)