正则表达式和BBCode - 完善嵌套报价
我正在为我的网站使用一些BBcode。正则表达式和BBCode - 完善嵌套报价
我已经设法让大部分代码完美运行,但是[QUOTE]标记给了我一些伤心。
当我得到这样的:从嵌套报价
> 1 said: [QUOTE=2]This is a quote from
> someone else
This is someone else quoting someone else[/QUOTE]
所以发生的是[/报价]被关闭报价块:
[QUOTE=1]
[QUOTE=2]
This is a quote from someone else
[/QUOTE]
This is someone else quoting someone else
[/QUOTE]
它将返回。
我使用的正则表达式是:
"[quote=(.*?)\](.*?)\[/quote\]'is"
我怎样才能使这样的嵌套行情会正常显示?
谢谢。
你可以(根据自己的changelog可用,因为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个之前的捕获组»替换为第N个替换组捕获名为“a”的组。
这不是一个真正的正则表达式适合的任务。这是几乎就像试图解析使用正则表达式,and we know what happens when you do that HTML ...
什么你可能做,即使这样,我不认为这是所有伟大的想法,就是用preg_split分割您将文本输入到标记和非标记中。所以,你会拥有像这样的列表:
- [QUOTE = 1]
- (空白)
- [QUOTE = 1]
- 这是从别人报价
- [/ QUOTE]
- 这是别人别人引用某人
- [/ QUOTE]
然后,您会遍历列表,将标记转换为HTML并输出未修改的纯文本。你甚至可以看中并保持“嵌套”的数量,这样如果你在不期望的时候遇到“[/ quote]”,你可以处理这种情况比输出无效的HTML好一点。或者,您只需输出一些东西,然后让HTMLPurify或稍后清理它。
嗯,我会给它一个去。似乎没有一个简单的解决方案! – Moe 2010-05-26 02:03:09
我从来没有听说过递归正则表达式。 它是如何工作的? – Moe 2010-05-26 07:21:28
那是行得通的,但它不会改变引号内的正则表达式,因为它的HTML标记 – Moe 2010-05-26 11:22:08
要更改所有引号,必须在匹配时重新应用此正则表达式,可能会在每次迭代时增加一些深度变量。 – ZyX 2010-05-26 11:35:38