0

嗨,我正在使用一个非常基本的 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);

}

4

1 回答 1

0

可以通过递归正则表达式进行调整:

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

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

否则将需要使用 重写您的代码preg_replace_callback。我懒得展示,因为这已经出现了几十次(尝试站点搜索!),之前已经解决了,等等。

于 2011-08-26T17:58:16.057 回答