内部BBCode的PHP BBCode格式

时间:2014-07-30 20:57:02

标签: php regex bbcode

我开发了一个类,允许我控制许多BBCode标签和其他特殊格式,并且运行良好。我遇到的问题是内部标签与外部标签相同。例如,另一个[quote] [/ quote]中的[quote] [/ quote]就像这样:

[quote=Foo]Here is a quote:

[quote=Bar]Test[/quote]

Did that work?[/quote]

问题是正则表达式在找到外部开始[quote]的匹配时找到内端[/ quote]。

我是否必须逐行拆分才能找到合适的匹配或是否有一种优雅的方法?

这是对我如何做的一个小测试(有一点但功能上这就是它正在做的事情):

$desc = '[quote=Foo]Here is a quote:

[quote=Bar]Test[/quote]

Did that work?[/quote]';

$args = array(
    'tid' => 1234
);

preg_match('`\[(quote)=?(.*?)\]((\r\n|\r|\n|.)+?)\[\/quote\]`i', $desc, $matches);

list($str, $tag, $match, $innertext) = $matches;

$params = explode(';', $match);
$name   = array_shift($params);

$replacement = '<div class="quote">' . $name . '<span class="quote-text">' . $innertext . '</span></div>';

$string = str_replace($str, $replacement, $desc);

其他标签在嵌套在其他标签中时很好,只是类似的标签找不到匹配。

1 个答案:

答案 0 :(得分:1)

尝试使用贪婪量词,并启用s dotall 修饰符。

preg_match('~\[(quote)=?(.*?)\](.+)\[/quote\]~is', $desc, $matches)

Working Demo