正则表达式BBCode - 完善嵌套报价

时间:2010-05-26 01:09:34

标签: php regex bbcode

我正在为我的网站制作一些BBcode。

我已经设法让大部分代码完美运行,但是[QUOTE]标签给了我一些悲伤。

当我得到这样的东西时:

[QUOTE=1]
[QUOTE=2]
This is a quote from someone else
[/QUOTE]
This is someone else quoting someone else
[/QUOTE]

它将返回:

> 1 said:  [QUOTE=2]This is a quote from
> someone else

This is someone else quoting someone else[/QUOTE]

所以发生的事情是嵌套报价中的[/ quote]是关闭报价块。

我正在使用的正则表达式是:

"[quote=(.*?)\](.*?)\[/quote\]'is"

如何才能使嵌套报价正确显示?

谢谢。

2 个答案:

答案 0 :(得分:2)

你可以构造递归正则表达式(根据libpcre-3.0的更新日期可用):

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

但如果你遵循@codeka建议会更好。

<强>更新 (?R)这里的意思是“将整个正则表达式插入(?R)出现的位置”。因此,a(?R)?ba(a(?-1)?b)?b相当(如果您忘记捕获群组),相当于a(a(a(?-1)?b)?b)?b,依此类推。而不是(?R),您可以使用(?N)(?+N)(?-N)(?&a),这意味着«替换为第N个捕获组»,«替换为N'下一个捕获组»,«替换为前N个捕获组»和«替换为捕获组名为«a»»。

答案 1 :(得分:0)

这不是正则表达式有用的任务。它几乎就像尝试使用正则表达式解析HTML一样,and we know what happens when you do that ......

标签。所以你最终会得到一个这样的列表:

  • [QUOTE = 1]
  • (空白)
  • [QUOTE = 1]
  • 这是其他人的引用
  • [/ QUOTE]
  • 这是其他人引用其他人
  • [/ QUOTE]

然后,您将遍历将标记转换为HTML并输出未经修改的纯文本的列表。您甚至可以获得花哨并保持“嵌套”计数,这样如果您在不期望它时遇到“[/ quote]”,您可以比仅输出无效HTML更好地处理这种情况。或者,您只需在找到它们时输出内容,然后让preg_split或其他内容清理它。