2011-05-21 47 views
0

我使用這個功能的BBcode解析:BB碼分析問題

function bbcode ($message) { 
$search = array(
'@\[(?i)b\](.*?)\[/(?i)b\]@si', 
'@\[(?i)i\](.*?)\[/(?i)i\]@si', 
'@\[(?i)u\](.*?)\[/(?i)u\]@si', 
'@\[color=rgb(.*?)\](.*?)\[\/color\]@si', 
'@\[quote](.*?)\[\/quote\]@si', 
'@\[li](.*?)\[\/li\]@si', 
'@\[ul](.*?)\[\/ul\]@si', 
); 

$replace = array(
'<b>\\1</b>', 
'<i>\\1</i>', 
'<u>\\1</u>', 
'<span style=\"color:rgb\\1\">\\2</span>', 
'<span class=\"quote">\\1</span>', 
'<li>\\1</li>', 
'<ul>\\1</ul>', 
); 
return preg_replace($search , $replace, $message); 
} 

在大多數情況下,它工作正常,但並非總是如此。

例如:

[color=rgb(102, 0, 102)]H[color=rgb(204, 0, 0)]e[/color]llo[/color] 

結果是:

<span style="color:rgb(102, 0, 102)">H[color=rgb(204, 0, 0)]e</span>llo[/color] 

正如你可以看到,只有第一[色= ...] [/色]已被轉換爲HTML。第二個保持原樣。有任何想法嗎?

+0

如果你想要這樣的遞歸結構,你必須使用比普通的'preg_replace'更復雜的東西。正則表達式不能很好地處理層次結構。 – 2011-05-21 08:55:41

+0

網上有數以百萬計的免費腳本,但我花了幾天時間,找不到一個好的bbcode解析器,它的工作沒有問題:( – tfe 2011-05-21 09:18:27

回答

0

它按照您指定的正確工作。問題在於嵌入序列。 我建議你進行兩次替換。一個用於起始標籤,另一個用於結束標籤。 您也許能夠首先指定所有開始標記,並將所有結束標記最後指定爲替換數組中的所有結束標記。 無論如何,這使搜索替換值更簡單,並且在大多數情況下,您不需要使用反向引用,尤其是對於簡單標籤(如[b])。 這應該解決您的問題。

+0

然後,一些無知的用戶出現並通過不正確關閉他們的bbcode標籤來破壞您的HTML。 – 2011-05-21 09:43:13

+0

Matti Virkkunen,是的,這是問題!有些用戶不能關閉bbcode標籤。 – tfe 2011-05-21 10:03:06