Генерация текста по шаблону

TO
На сайте с 21.09.2007
Offline
170
1745

Нужно сделать небольшой генератор мелких текстов для сайта. Пришлось наконец изучить досконально регулярные выражения. Это штукая сложная, конечно )

Задача в следующем. Есть шаблон, например, такой:

Наша компания предлагает лучшие {гостиницы|отели} в Санкт-Петербурге, к вашим услугам самое {недорогое|дешевое|экономичное} размещение в городе на Неве.

Я так понимаю, порядок генерации следующий:

1. получаем массив областей с вариантами (в данном случае две такие области). Массив сл. вида:


(0) => {гостиницы|отели}
(1) => {недорогое|дешевое|экономичное}

2. Для каждого из элементов массива получаем случайным образом один из вариантов. Тут все просто - отбрасываем скобки, делаем explode, ищем случайный элемент.

3. Приводим массив к виду


(0) => array({гостиницы|отели}, гостиницы)
(1) => array({недорогое|дешевое|экономичное}, дешевое)

4. Заменяем в тексте

Внимание вопрос! При помощи какой функции можно получить массив в пункте 1? Я так понимаю, нужно хитро это распарсить регуляркой, но вот как?

Или же у кого есть альтернативный алгоритм - буду рад соображениям.

Думаю, многие генерируют текст подобным образом. )

CunninGFox
На сайте с 05.10.2007
Offline
167
#1

Может, конечно скажу глупость, но зачем изобретать велосипед и делать это на сервере, если есть куче десктопных синонимайзеров, и сгенерированный в нем текст можете импортнуть в базу по нужным вам параметрам?

Комплексное продвижение сайтов: увеличение количества клиентов для Вашей компании. От 8.000 рублей. Возможна работа по договору и оплата по безналу. Пишите: seo@sergeus.ru
TO
На сайте с 21.09.2007
Offline
170
#2

CunninGFox, там целый процесс. У меня постоянно добавляются в базу объекты, для каждого из которых необходимо генерировтаь разные вещи, одна из которых такой текст.

Соответственно, если я буду пользоваться сторонним софтом, кому-то придется при каждом добавлении к нему обращаться и заносить потом в базу.

А, учитывая, что тут не только варианты генерируются,*но еще и разная информация из базы подставляется (я ее не указывал, ибо там все просто), то при реализации моего варианта получится сильная экономия времени.

maldivec
На сайте с 04.11.2008
Offline
160
#3
D
На сайте с 14.01.2007
Offline
153
#4
t_o_x_a:
При помощи какой функции можно получить массив в пункте 1?

а обязательно делать всё в одно действие? ищем всё в скобках и explode по |

гораздо проще будет через неделю в этом разобраться

TO
На сайте с 21.09.2007
Offline
170
#5
Dinozavr:
а обязательно делать всё в одно действие? ищем всё в скобках и explode по |
гораздо проще будет через неделю в этом разобраться

Я так и хочу. Но не знаю, какой регуляркой искать все в скобках.

---------- Добавлено 12.10.2012 в 16:43 ----------

О, спасибо!

D
На сайте с 14.01.2007
Offline
153
#6

t_o_x_a, /{([^}+])}/

IL
На сайте с 20.04.2007
Offline
435
#7

По идее, правильно рекурсивно обходить.. тынц

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
D
На сайте с 14.01.2007
Offline
153
#8
ivan-lev:
По идее, правильно рекурсивно обходить.. тынц


function shablonize($text){
if (preg_match("/{([^}]+)}/", $text, $matches)){
foreach($matches[1] as $m){
$parts = explode("|",$m);
$rnd=rand(0,count($m));
$text=str_replace("{".$m."}",$parts[$rnd],$text)
}
}
return $text;
}
IL
На сайте с 20.04.2007
Offline
435
#9
Dinozavr:
$rnd=rand(0,count($m));

Dinozavr, всё верно.. однако следует учитывать возможное появление дублей.. при генерации нескольких (нам ведь не один вариант нужен) текстов. Хотя, понятно, что два "соседних" варианта при последовательном переборе, как правило, очень похожи.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий