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 标签中有另一个列表时,它完全无法解析,屏幕截图显示:图像1

它应该是这样的:图片2

我知道我的代码可能对它来说太简单了,但是我该如何调整它以便它可以解析列表项中的列表?

4

1 回答 1

3

而不是使用正则表达式,您有几个选项..

  1. 使用 PHP 的BBCode Parsing 扩展
  2. 做一个更简单的替换,即。直接替换[ul]<ul>等。

我并不是说它不能用 Regex 完成,只是它不是最简单的选择。

这是一个仍然基于正则表达式的替换:

$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);
于 2013-07-09T09:36:08.280 回答