парсер цитирования

Креведка

Новичок
парсер цитирования

День добрый! суть такова - нужно сделать обрамление цитирования, скажем, в таблицу. цитирование может быть как и вложенным, так и последовательным, т.е. например так
[quote 1] текст1 [/quote] текст 2
[quote 2] текст3
[quote 3] текст4 [/quote] текст 5
[/quote] текст 6

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

но что то мне подсказывает что есть более элегантное (в плане производительности) решение, подскажите пожалуста - в какую сторону копать? и какие тут есть подводные камни?

спасибо за внимание
 

baev

‹°°¬•
Команда форума
Тупо все [/QUOTE]
заменить на </td>, а все [quote *] на <td>.
 

Креведка

Новичок
тупо - не пойдёт. ибо там не просто <td> а полностью таблица... а если не будет хватать открывающих или закрывающих тегов, то вполне логично поплывёт весь дизайн как максимум или будет не красивый (валидный) хтмл-код как минимум

-~{}~ 13.02.08 18:24:

насчёт гламура - мне скорее нужно практично и что б работало быстро, а не гламурно, но на всякий случай почитаю при случае про эти самые конечные автоматы
 

Креведка

Новичок
див в каком смысле? в смысле что сообщение писать в див и пофигу что там таблицы не закрыты? или вместо таблиц рисовать дивы и пофигу что они не закрыты или наоборот много открытых?
 

FractalizeR

Новичок
Автор оригинала: Креведка
тупо - не пойдёт. ибо там не просто <td> а полностью таблица... а если не будет хватать открывающих или закрывающих тегов, то вполне логично поплывёт весь дизайн как максимум или будет не красивый (валидный) хтмл-код как минимум
Проверять на закрытие, наверное, все равно придется. Можно посчитать количество открывающих, затем количество закрывающих и сравнить. А потом, как предлагали, td или div.
 

baev

‹°°¬•
Команда форума
тупо - не пойдёт. ибо там не просто <td> а полностью таблица...
— дальше самим думать влом?

Почему не прокатит комбинация "<table><tr><td>"?
(Ну и — закрытие такое же...)
 

litvinenko

Новичок
а почему не прокатит все открывающие quote заменить на <div> а все закрывающие - на </div>
?
 

Креведка

Новичок
вообще конечно прокатит... но меня смущает то, что возможно останутся не закрытые дивы, если пользователь вдруг "забудет" поставить закрывающий квот

-~{}~ 14.02.08 00:57:

Автор оригинала: baev
— дальше самим думать влом?

Почему не прокатит комбинация "<table><tr><td>"?
(Ну и — закрытие такое же...)
потому как при такой строке: [ quote 1]тратата
будет: <table><tr><td>тратата - закрывающего ессесна не будет
а при такой: тратата[ /quote]
будет: тратата</td></tr></table>
в принципе это всё не страшно, и насчёт того что дизайн сьедет я конечно погорячился, но мне не нравится такой не валидный хтмл. посему решил остановится на рекурсии, если кому вдруг станет интересно вот код:
PHP:
function parse_quote($pos1) {
	global $forum_text_bb;
	$pos2 = strpos($forum_text_bb, '[/quote]', $pos1);
	$pos3 = strpos($forum_text_bb, '[quote', $pos1+1);
	if ($pos1 && $pos2 && $pos3 && $pos3<$pos2) {
		$pos3 = parse_quote($pos3);
		$pos2 = strpos($forum_text_bb, '[/quote]', $pos3);
		if ($pos2) {
			$sub = substr($forum_text_bb, $pos1, $pos2-$pos1+8);
			$num = preg_match_all('/\[quote([^\]]*)\](.*)\[\/quote/', $sub, $params);
			$new = '<table class="citata" cellpadding=2 cellspacing=0><tr><td class=citata_title>'.$params[1][0].'</td></tr><tr><td class=citata_text>'.$params[2][0].'</td></tr></table>';
			$forum_text_bb = str_replace($sub, $new, $forum_text_bb);
			return $pos2+2;
		} else return $pos3+2;
	}
	if ($pos2 && $pos2>$pos1 && (!$pos3 || $pos2<$pos3)) {
		$sub = substr($forum_text_bb, $pos1, $pos2-$pos1+8);
		$num = preg_match_all('/\[quote=?([^\]]*)\](.*)\[\/quote\]/', $sub, $params);
		//$sub = $params[2][0];
		$new = '<table class="citata" cellpadding=2 cellspacing=0><tr><td class=citata_title>'.$params[1][0].'</td></tr><tr><td class=citata_text>'.$params[2][0].'</td></tr></table>';
		$forum_text_bb = str_replace($sub, $new, $forum_text_bb);
		return $pos2;
	}
	return $pos1+1;
	
}

	$pos = 0; $i =0;
	while ($pos = strpos($forum_text_bb, '[quote', $pos)) {
		$pos = parse_quote($pos);
		$i++;
		if ($i==10) break;
	}
выглядит коряво, зато всё грамотно парсит : )
 

WP

^_^
Ничего вы не понимаете в картофельных очистках =) Всё делается одной регуляркой.
 

jonjonson

Охренеть
Креведка, не изобретайте велосипедов. Воспользуйтесь библиотекой для работы с BBCode http://xbb.uz/
 

Креведка

Новичок
2WP во, я про что и спрашивал - как это сделать регуляркой : )

2jonjonson сенкью вери мач, уже ковыряю эту бибилиотечку, очень заманчивая
 
Сверху