BBcode解析问题

时间:2011-05-21 08:49:45

标签: bbcode

我使用此函数进行BBcode解析:

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]

如您所见,只有第一个 [color = ...] [/ color] 已转换为html。第二个保持原样。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

它正如您指定的那样正常工作。问题在于嵌入式序列。 我建议你进行两次替换。一个用于起始标记,一个用于结束标记。 您也可以首先指定所有起始标记 所有结束标记都在替换数组中最后。 这使得搜索替换值无论如何都更简单,并且在大多数情况下你不会 需要使用反向引用,尤其是对于像[b]这样的简单标签。 这应该可以解决你的问题。