Синонимайзер на PHP – достаточно одной строчки
Как лучше назвать: синонимайзер или синонимизатор. Можно просто написать: "синоним(айзер|изатор)", после чего передать эту строку php-функции, в результате получив одно из написаний. Это и будет синонимизация контента, т.е. генерация уникальных описаний.
Единственное, что я не понимаю – зачем делать из этого событие. Потому что достаточно одной строчки на PHP.
Итак, имеем строку $s:
$s = 'Чтобы начать (работать|валять дурака|сходить с ума) надо заняться (спортом|сексом|чтением блогов)';
Всё, что нужно – в следующей строчке:
echo preg_replace('/\( (.*?) \)/xse', '$ar[array_rand($ar = explode("|", "\\1"), 1)]', $s);
В итоге получилось вот это.
Здесь стоит предупредить, что строка $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.
Всё. (Действительно, зачем мне было делать из этого событие
)

июля 12, 2008 в 23:05
Думаю, событие делается из рассчета на тех людей, которые даже приблизительно не знают PHP, а поэтому не могут определить, насколько сложно создать одну или другую функцию.
июля 16, 2008 в 11:15
Это больше похоже на уникализатор чем на синонимайзер.
июля 16, 2008 в 11:20
Ну в субмиттере это действительно полезная штука (особенно, если там реализован макроязык на уровне SAG), а так да, не событие мирового масштаба. Ну сделал человек полезную для непрограммистов штуку, которую за час, наверное, можно сделать и раздает, не продает же в самом деле, жаль я не додумался
"сеошников" много, которые не то что программирования, а даже html толком не знают
июля 16, 2008 в 11:21
Вован, уникализаторов полно, а синонимайзера нету нормального доступного, маркетинговый ход
июля 22, 2008 в 19:37
2VolCh
"сеошников" много, которые не то что программирования, а даже html толком не знают -
для нас программистов это очень хорошо! Есть много людей, которые могут заплатить деньги за элементарный скрипт, только потому что не знают, насколько это элементарно.
августа 5, 2008 в 18:49
Еще б так просто морфологию учитывать можно было
августа 13, 2008 в 11:18
а как еще в это регулярное выражение добавить [..|..|..|..|..] что бы preg_replace_callback вызывал функцию перемешивания всего что в квадратных скобках. согласен стыдно не знать основы. но это РВ всегда мне не нравились.
можно конечно сначала перемешать потом заменить, но хочется сделать красиво
августа 13, 2008 в 16:09
2 mihalich: Ну, это не основы
конечно.
заменить регулярное выражение на:
'/\[ (.*?) \]/xs'августа 21, 2008 в 16:38
а preg_replace_callback вызовет random_words для каждой пары скобок []?
августа 22, 2008 в 13:55
я же кажется написал, что достаточно заменить
\(на\[– просто скобки (как спецсимволы регэксов) надо экранировать обратным слэшем. Хотите qqqq*([*ааа|ббб|ввв*])* – пишите'/\*\(\[\*(.*?)\*\]\)\*/s'(убрал лишние пробелы и следовательно не нуженx)сентября 2, 2008 в 13:00
спасибо!!! сделал сначала обработку [..|..|..|..|..] а потом (..|..|..|..|..)
ломаю голову как бы усложнить что обрабатывать любые выражения типа [..(..|..)..|..] и наоборот (..[..|..]..) или даже что то вроде такого (..[..|(..|..)]..|..)
сентября 3, 2008 в 13:50
Только для квадратной скобки:
$s = '[Дед|Баб]ушка [идёт [погулять|в магазин]..|поехали [сюда[!|?|.]]]'; while($s0 != $s = preg_replace_callback('/\[ ([^\[\]]*) \]/xs', "random_words", $s0 = $s)); echo $s;Для
[ ]и( ):while($s0 != $s = preg_replace_callback('/(?: (\[)|(\() ) ([^\[\]\(\)]*) (?(1) \]|\) )/xs', "random_words", $s0 = $s));и в функции
random_words–$m[3].сентября 9, 2008 в 17:22
программа SEO anchor generator делает примерно тоже самое, только вот функций побольше...
октября 4, 2008 в 23:51
В силу своей лаконичности - один из лучших постов по уникализации текста! Если ПХП кое-как понимаю, то регулярные выражения - для меня китайское таинство. В общем спасибо! Пойду внедрять на своем самописном сайтике.
октября 14, 2008 в 15:25
//Синонимайзер на PHP – достаточно одной строчки
офигеть, а мы то думали....
Лучше базу синонимов выложи хорошую, а то составлять такие шаблоны-заготовки это такой геморой
декабря 1, 2008 в 22:30
Мне кажется ништяк!
декабря 2, 2008 в 02:46
Благо тому, кто тверд по натуре и гибок по здравому рассуждению))