3

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

我怎样才能使它如此嵌套的引号将正确显示?

谢谢你。

4

2 回答 2

3

您可以构造递归正则表达式(根据他们的更改日志从 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)and(?&a)这意味着«用第 N 个捕获组替换»、«用第 N 个下一个捕获组替换»、«用第 N 个前一个捕获组替换»和«用名为 «a 的捕获组替换»»。

于 2010-05-26T03:23:16.367 回答
0

这并不是正则表达式真正适合的任务。这几乎就像试图用正则表达式解析 HTML,我们知道当你这样做时会发生什么......

可以做的,即使那样我也不认为这是一个好主意,就是使用preg_split将输入文本拆分为标签和非标签。所以你最终会得到一个这样的列表:

  • [报价=1]
  • (空白的)
  • [报价=1]
  • 这是别人的一句话
  • [/引用]
  • 这是别人引用别人的
  • [/引用]

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

于 2010-05-26T01:24:26.200 回答