【问题标题】:Regex & BBCode - Perfecting Nested QuoteRegex & BBCode - 完善嵌套报价
【发布时间】:2011-02-23 23:21:47
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: php regex bbcode


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 嗯,我试试看。似乎没有一个简单的解决方案!
    【解决方案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替换'th previous capture group» 和 «substitute with capture group named «a»».

    【讨论】:

    • 这行得通,但它不会将引号内的正则表达式更改为它的 HTML 标签
    • 要更改所有引号,您必须在匹配时重新应用此正则表达式,可能会在每次迭代时增加一些深度变量。
    • @zylstra 三年多后,我无法回忆起这样的细节。在我写完这篇文章后,猜猜有什么东西(评论?)被删除了。 (可能会发表评论,因为我在这里没有看到已删除的答案。) 90% 的建议与下面的 Dean Harding 相同:构造一个解析器来代替使用正则表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多