嵌套的bbcode引用如何>

时间:2011-08-26 17:42:35

标签: php bbcode quote

我正在使用一个非常基本的bbcode解析器。

你们可以帮助我解决我的问题吗?

但是例如这写的是:

[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);

}

1 个答案:

答案 0 :(得分:0)

可以使用递归正则表达式进行调整:

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

这将至少确保输出div不会被错误地嵌套。但是你仍然需要运行正则表达式两次或三次以捕获所有引用块。

否则需要使用preg_replace_callback重写代码。哪个我不能打扰展示,因为这已经出现了几十次(尝试网站搜索!),之前已经解决了等等。