开发者

nested bb code quotes how to>

Hi im using a pretty basic bbcode parser.

cou开发者_如何学Gold you guys help me with a problem of mine?

but when for example this is written:

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

the output is this:

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

how would i go and fix that? im realllly bad at the whole preg_replace stuff.

this is my parser:

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

}


This could be adapted with a recursive regex:

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

Which will at least ensure that the output divs will not be incorrectly nested. But you would still have to run the regex twice or three times to catch all quote blocks.

Otherwise it would require a rewrite of your code with preg_replace_callback. Which I cannot be bothered to showcase, since this came up a few dozen times already (try the site search!), has been solved before, etc.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜