Синонимайзер на PHP – достаточно одной строчки

Опубликовано admin в Втр, 28/12/2010 - 16:00

Как лучше назвать: синонимайзер или синонимизатор. Можно просто написать: "синоним(айзер|изатор)", после чего передать эту строку php-функции, в результате получив одно из написаний. Это и будет синонимизация контента, т.е. генерация уникальных описаний.

Единственное, что я не понимаю – зачем делать из этого событие. Потому что достаточно одной строчки на PHP.

Итак, имеем строку $s:

$s = 'Чтобы начать (работать|валять дурака|сходить с ума) надо заняться (спортом|сексом|чтением блогов)';

Всё, что нужно – в следующей строчке:

echo preg_replace('/\(  (.*?)  \)/xse', '$ar[array_rand($ar = explode("|", "\\1"), 1)]', $s);

В итоге получилось вот это (_http://dev.mrkto.com/synonimizer.php).

Здесь стоит предупредить, что строка $s НЕ ДОЛЖНА БЫТЬ ДОСТУПНА ДЛЯ РЕДАКТИРОВАНИЯ ПОЛЬЗОВАТЕЛЮ. Иначе мы получим выполнение произвольного php-кода :).

Чтобы этого не было, и чтобы разобраться подробнее:

echo preg_replace_callback('/\(  (.*?)  \)/xs', "random_words", $s);
 
function random_words($m)
{
	$ar = explode("|", $m[1]);
	return $ar[array_rand($ar, 1)];
}

В первой строчке мы вызываем функцию «найти и заменить по регулярному выражению», где массив совпадений передаётся в функцию, а возвращаемое функцией значение подставляется на место совпадения с маской. Экранируем круглые скобки, добавляем модификатор "x", чтобы игнорировать пробелы (которые добавили для наглядности).

Функция у нас получает массив вида:

Array
(
    [0] => (работать|валять дурака|сходить с ума)
    [1] => работать|валять дурака|сходить с ума
)

Берём $m[1], превращаем его в массив $ar, разделяя по "|". И возвращаем случайный ключ из массива $ar.

Всё. (Действительно, зачем мне было делать из этого событие :) )



Статья взята с http://mrkto.com (_http://mrkto.com/synonimizer_php/)

( categories: )