2010-05-26 28 views
3

我正在为我的网站使用一些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" 

我怎样才能使这样的嵌套行情会正常显示?

谢谢。

回答

2

你可以(根据自己的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”的组。

+0

我从来没有听说过递归正则表达式。 它是如何工作的? – Moe 2010-05-26 07:21:28

+0

那是行得通的,但它不会改变引号内的正则表达式,因为它的HTML标记 – Moe 2010-05-26 11:22:08

+0

要更改所有引号,必须在匹配时重新应用此正则表达式,可能会在每次迭代时增加一些深度变量。 – ZyX 2010-05-26 11:35:38

0

这不是一个真正的正则表达式适合的任务。这是几乎就像试图解析使用正则表达式,and we know what happens when you do that HTML ...

什么你可能做,即使这样,我不认为这是所有伟大的想法,就是用preg_split分割您将文本输入到标记和非标记中。所以,你会拥有像这样的列表:

  • [QUOTE = 1]
  • (空白)
  • [QUOTE = 1]
  • 这是从别人报价
  • [/ QUOTE]
  • 这是别人别人引用某人
  • [/ QUOTE]

然后,您会遍历列表,将标记转换为HTML并输出未修改的纯文本。你甚至可以看中并保持“嵌套”的数量,这样如果你在不期望的时候遇到“[/ quote]”,你可以处理这种情况比输出无效的HTML好一点。或者,您只需输出一些东西,然后让HTMLPurify或稍后清理它。

+0

嗯,我会给它一个去。似乎没有一个简单的解决方案! – Moe 2010-05-26 02:03:09