2011-08-26 39 views
0

嗨,即時通訊使用一個非常基本的bbcode分析器。嵌套的bb代碼引號如何>

你們能幫我解決我的問題嗎?

但當例如這樣寫:

[quote=tanab][quote=1][code]a img{ 
text-decoration: none; 
}[/code][/quote][/quote] 

輸出是這樣的:

tanab said: 
[quote=1] 
a img{ 
    text-decoration: none; 
} 
[/quote] 

如何將我去解決呢?即時通訊在整個preg_replace的東西真的很糟糕。

這是我的解析器:

function bbcode($input){ 
$input = htmlentities($input); 

$search = array(
      '/\[b\](.*?)\[\/b\]/is', 
      '/\[i\](.*?)\[\/i\]/is', 
      '/\[img\](.*?)\[\/img\]/is', 
      '/\[url=(.*?)\](.*?)\[\/url\]/is', 
      '/\[code\](.*?)\[\/code\]/is', 
      '/\[\*\](.*?)/is', 
      '/\\t(.*?)/is', 
      '/\[quote=(.*?)\](.*?)\[\/quote\]/is', 
); 

$replace = array(
      '<b>$1</b>', 
      '<i>$1</i>', 
      '<img src="$1">', 
      '<a href="$1">$2</a>', 
      '<div class="code">$1</div>', 
      '<ul><li>$1</li></ul>', 
      '&nbsp;&nbsp;&nbsp;&nbsp;', 
      '<div class="quote"><div class="quote-writer">$1 said:</div><div class="quote-body">$2</div></div>', 

); 

return preg_replace($search,$replace,$input); 

}

+2

我可以建議,爲了上帝的愛,你[不要' t使用BBCode](http://stackoverflow.com/questions/3788959/regex-to-split-bbcode-into-pieces/3792262#3792262)? – NullUserException

+0

你想解決什麼問題?問題是什麼? – afuzzyllama

+0

[嵌套bb代碼的可能重複將不會做我想要的](http://stackoverflow.com/questions/7198302/nested-bb-codes-wont-do-what-i-want) – mario

回答

0

可以使用一種用遞歸的正則表達式:

'/\[quote=(.*?)\](((?R)|.*?)+)\[\/quote\]/is' 

這將至少確保輸出的div不會被錯誤地嵌套。但是你仍然需要運行正則表達式兩次或三次才能捕獲所有報價塊。

否則,需要用preg_replace_callback重寫您的代碼。我不能打擾展示,因爲這已經出現了幾十次(嘗試網站搜索!),之前已經解決了,等。