我正在使用一个非常基本的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>',
' ',
'<div class="quote"><div class="quote-writer">$1 said:</div><div class="quote-body">$2</div></div>',
);
return preg_replace($search,$replace,$input);
}
答案 0 :(得分:0)
可以使用递归正则表达式进行调整:
'/\[quote=(.*?)\](((?R)|.*?)+)\[\/quote\]/is'
这将至少确保输出div不会被错误地嵌套。但是你仍然需要运行正则表达式两次或三次以捕获所有引用块。
否则需要使用preg_replace_callback
重写代码。哪个我不能打扰展示,因为这已经出现了几十次(尝试网站搜索!),之前已经解决了等等。