我正在为我的网站制作一些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"
如何才能使嵌套报价正确显示?
谢谢。
答案 0 :(得分:2)
你可以构造递归正则表达式(根据libpcre-3.0的更新日期可用):
\[quote=(.*?)\](((?R)|.)*?)\[\/quote\]
但如果你遵循@codeka建议会更好。
<强>更新强>
(?R)
这里的意思是“将整个正则表达式插入(?R)
出现的位置”。因此,a(?R)?b
与a(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 ......
标签。所以你最终会得到一个这样的列表:
然后,您将遍历将标记转换为HTML并输出未经修改的纯文本的列表。您甚至可以获得花哨并保持“嵌套”计数,这样如果您在不期望它时遇到“[/ quote]”,您可以比仅输出无效HTML更好地处理这种情况。或者,您只需在找到它们时输出内容,然后让preg_split或其他内容清理它。