Вырезка цитат [q][/q] на регах - мой рег не понимает вложений :(

Сенсей

Новичок
Вырезка цитат [q][/q] на регах - мой рег не понимает вложений :(

Мая рега такая :

PHP:
$replace[] = '#\[q](.*)\[/q]#siU';
$replacements[] = '<table cellpadding="3" cellspacing="0" bgcolor="#F4F5F1" width="100%" style="border: #E7E7E7 1px solid;"><tr><td class="links_title">\\1</td></tr></table>';
$output = preg_replace($replace, $replacements, $input);
При таком раскладе пашет нормально:

Код:
[q]Привет как дела?[/q]
Все нормально как у тя?
Но вот вложенные.. например:

Код:
[q][q]Привет как дела?[/q]

[q]Все нормально как у тя?[/q][/q]

У меня все пучком
Не хочет обрабатывать как надо...
Как я только не мучал регу... не могу сделать :(
 

diamond_krnl

pure-php
заменяй по одиночке "теги".
но котроль вложенности только с конечными автоматами, либо как нить через задний проход (что одно и тоже) . (=
 

gromitus

Новичок
может сделать сначала поиск [m]preg_match_all[/m] a потом просто [m]str_replace[/m] каждого тега по-отдельности? (я имею ввиду то, что бы там мусор не закрался - всмысле незакрытые или не открытые теги....)
 

bgm

&nbsp;
Re: Вырезка цитат [q][/q] на регах - мой рег не понимает вложений :(

Автор оригинала: Сенсей
Но вот вложенные.. например:
Дело в том, что регулярные выражения не могут быть использованы для описания вложенных конструкций. Тут уже речь идёт о контекстно-свободной грамматике.

Способ решения твоей задачи может быть таким:
1) Проверяешь баланс открывающих блоков и закрывающих;
2) Если баланс есть, то последовательно заменяешь открывающие блоки на соответствующий шаблон и тоже самое проделываешь с закрывающим. Вот тут регулярные выражения тебе помогут.

или же смотришь реализацию в том же pHpBB.
 

Azy

Новичок
Гм... А почему бы не сделать ([q]*) и ([/q]*)? И заменять их на пустой паттерн.
 

Сенсей

Новичок
Автор оригинала: Azy
Гм... А почему бы не сделать ([q]*) и ([/q]*)? И заменять их на пустой паттерн.
Потому что хочу сделать все красиво...

2all

Не регами сделать легко...
Надеялся на реги... с ними легче...
 

bgm

&nbsp;
Надеялся на реги... с ними легче...
Примерно год назад пытался решить подобную задачу с помощью "красивого" регулярного выражения, пока не углубился в теорию и не прочитал, что (повторюсь) - регулярными выражениями не описать вложенные конструкции (упоминание этого факта можно найти у А.Ахо и Дж.Ульмана).
 

Azy

Новичок
Сенсей
Гм... да здесь только вручную парсить. делай банальный str_replace ;)

-~{}~ 05.05.05 16:14:

А если так:
PHP:
	$input = "[q][q]Привет как дела?[/q]asdasdad[/q]";
	$replace[] = '/\[q\](.+)\[\/q\]/';
	$replacements[] = '<table cellpadding="3" cellspacing="0" bgcolor="#F4F5F1" width="100%" style="border: #E7E7E7 1px solid;"><tr><td class="links_title">\\1</td></tr></table>'; 
	while (preg_match('/\[q\](.+)\[\/q\]/', $input))
	{
		$input = preg_replace($replace, $replacements, $input);
	}

	echo $input;
 

mani13

Новичок
"#\[q\](.*(?:\[q\].*\[/q\].*)*)\[/q\]#isU"

Azy
попробуй
$input = "[q][q]quote[/q]quote[/q]text[q]quote[/q]";
 

pr0mo

Новичок
У Котерова "PHP5" детально рассмотрена данная ситуация.
Смотри там.
 

diamond_krnl

pure-php
необойдётесь сдесь лишь регами, уверю, не парьтесь.
всегда найдётся тест который завалит регулярное выражение.
 

Azy

Новичок
pr0mo
На электронный вариант можешь дать ссылку?
 

Сенсей

Новичок
Вобщем сделал так :

PHP:
	while (preg_match('#\[q\](.*(?:\[q\].*\[/q\].*)*)\[/q\]#isU', $input))
	{
		$input = preg_replace('#\[q\](.*(?:\[q\].*\[/q\].*)*)\[/q\]#isU', '<table cellpadding="3" cellspacing="0" bgcolor="#F4F5F1" width="100%" style="border: #E7E7E7 1px solid;"><tr><td class="links_title">\\1</td></tr></table>', $input);
	}
ВСЕМ спасибо!
Но вот теперь думаю... не будет ли это слишком накладно для проца...
 

mani13

Новичок
единственное НО, которое заметил - не работает с 3-уровневыми цитатами :)

вообще, читаем строку, находим [q], идём дальше, если есть ещё [q], то увеличиваем счётчик на 1, находим [/q], уменьшаем счётчик, если счётчик равен 0, то это закр. тег, вырезаем внутренности, проходимся по ним... на это не регулярные выражения...
 
Сверху