2010-07-09 6 views
0

Я делаю свой собственный парсер bbcode, и у меня проблема, когда я пытаюсь сделать рекурсивную цитату.PHP - BBCode parser - рекурсивный [quote] с regex и preg_replace

это мой код:

function forumBBCode($str){ 
$format_search=array(
'#\[quote=(.*?)\](.*?)\[/quote\]#is' 
); 

$format_replace=array(
'<blockquote class="quotearea"><i><a class="lblackbu" href="./index.php?status=userview&userv=$1">$1</a> wrote :</i><br />$2</blockquote>' 
); 

$str=preg_replace($format_search, $format_replace, $str); 
$str=nl2br($str); 
return $str; 
} 

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

возгласов и Тое за помощь

+1

Это довольно сложно, если вы новичок в регулярных выражениях. Рекурсивные регулярные выражения сложны, поэтому большинство людей выбирает флаг оценки/e и фактически имеет сгенерированное выражение «парсер» регулярного выражения в закрытом контенте. В любом случае, сначала прочитайте http://www.regular-expressions.info/ - это лучшее введение, чем руководство по PHP. – mario

+0

Я узнаю это руководство, и я постараюсь сделать функцию :) Я сообщу вам, я надеюсь, что вы все равно сможете мне помочь! Тпй !!! – markzzz

+0

Я думаю, что у вас есть два возможных способа решить это: a) пропустить содержимое и искать открывающие и закрывающие теги цитат и заменить их, если они были найдены (оставьте остальные как видимые bbcode) или b) используйте 'preg_replace_callback()' который снова вызывает себя, если найдены теги вложенных цитат. – mgutt

ответ

4

Это старый Q, но я вывешу мое решение в любом случае для ППЛ =]

$open = '<blockquote><span class="bold">Quote: </span><br />'; //the next few lines do the parsing for quote blocks. We 
     $close = '</blockquote>';          //have to do it outside the normal parsing arrays because that way does not allow nesting. 

     preg_match_all ('/\[quote\]/i', $str, $matches); 
     $opentags = count($matches['0']); 

     preg_match_all ('/\[\/quote\]/i', $str, $matches); 
     $closetags = count($matches['0']); 

     $unclosed = $opentags - $closetags; 
     for ($i = 0; $i < $unclosed; $i++) { 
       $str .= '</blockquote>'; 
     } 
//Do Quotes (nested) 
     $str = str_replace ('[quote]', $open, $str); 
     $str = preg_replace('/\[quote\=(.*?)\]/is','<blockquote class="darkbg"><span class="bold left">Quote: $1</span><br />', $str); 
     $str = str_replace ('[/quote]', $close, $str); 
return $str; 

мира.

+2

Вы позаботились о закрытых тегах. Что делать, если нераскрытые существуют? – wolo

Смежные вопросы