在BBCode中解析多个列表?

4

大家好,我有一个非常简单的bbcode解析系统,目前在处理列表嵌套时遇到了问题。

我的代码如下:

$find = array(
'/\[list\](.*?)\[\/list\]/is',
'/\[\*\](.*?)(\n|\r\n?)/is',
'/\[ul\](.*?)\[\/ul\]/is',
'/\[li\](.*?)\[\/li\]/is'
);

$replace = array(
'<ul>$1</ul>',
'<li>$1</li>',
'<ul>$1</ul>',
'<li>$1</li>'
);
$body = preg_replace($find, $replace, $body);

问题在于当您在li标签内部有另一个列表时,它就无法完全解析。屏幕截图显示:“image1”src 应该是这样的:“images2”src 我知道我的代码可能太简单了,但我该如何调整它以使其能够解析列表项中的列表?

这是因为(.*?)匹配。 - hjpotter92
你需要一个递归正则表达式 (?R)。否则,如果可能的话,为什么不只是用 <ul> <li> 替换所有的 [ul] [li] - HamZa
1个回答

3

与其使用正则表达式,你有几种选择:

  1. 使用PHP的BBCode解析扩展
  2. 进行更简单的替换,即用<ul>等直接替换[ul]

我不是说不能用正则表达式来完成,只是说这不是最简单的选项。

这里是基于正则表达式的替换方法:

$body = '[ul][li]test[/li][li]test[/li][li]test[ul][li]lol[/li][/ul][/li][li]hehe[/li][/ul]';

$find = array(
    '/\[(\/?)list\]/i',
    '/\[\*\](.*?)(\n|\r\n?)/i',
    '/\[(\/?)ul\]/i',
    '/\[(\/?)li\]/i'
);
$replace = array(
    '<$1ul>',
    '<li>$1</li>',
    '<$1ul>',
    '<$1li>'
);
$body = preg_replace($find, $replace, $body);

你说得对,我直接解析标签本身就可以了,谢谢! - NaughtySquid
检查更新,这是一个正则表达式,可以实现相同的效果。 - Rudi Visser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接