【问题标题】:Best way to parse bbcode解析bbcode的最佳方法
【发布时间】:2009-01-28 19:21:57
【问题描述】:

我想为一个 php 网站开发一个 bbcode 过滤器。 (我正在使用 cakephp,它将是一个 bbcode 助手) 我有一些要求。

Bbcode 可以嵌套。所以类似的东西是有效的。

[block]  
    [block]  
    [/block]  
    [block]  
        [block]  
        [/block]  
    [/block]  
[/block]  

Bbcode 可以有 0 个或多个参数。

示例:

[video: url="url", width="500", height="500"]Title[/video]

Bbcodes 可能有多种行为。

假设[url]text[/url] 将转换为[url:url="text"]text[/url] 或者视频 bbcode 可以在 youtube、dailymotion 之间进行选择......

我认为它可以满足我的大部分需求。我已经用正则表达式做了一些事情。但我最大的问题是匹配参数。事实上,我得到了嵌套的 bbcode 和 0 参数的 bbcode。但是当我为参数添加正则表达式匹配时,它没有正确匹配嵌套的 bbcode。

"\[($tag)(=.*)\"\](.*)\[\/\1\]" // 不是 .* 而是非贪婪匹配器

我现在没有完整的正则表达式,但我有一些看起来像那样的东西(上图)。

那么有没有办法用正则表达式或其他东西有效地匹配 bbcode。 我唯一能想到的是使用访问者模式并以这种方式将我的文本与每个可能的标签分开,我可以对我的文本解析有更多的控制,我可能可以验证我的文档,所以如果输入文本没有'没有有效的 bbcode。我可以在保存任何内容之前通知用户错误。

我会使用 sablecc 来创建我的文本解析器。 http://sablecc.org/

有更好的主意吗?或任何可能导致高效灵活的 bbcode 解析器的东西?

谢谢你,对不起我的英语不好......

【问题讨论】:

    标签: php cakephp bbcode sablecc


    【解决方案1】:

    有几个现有的用于解析 BBCode 的库,查看这些库可能比尝试编写自己的库更容易:

    这里有一对,如果你环顾四周,我相信还有更多:
    PECL bbcode
    PEAR HTML_BBCodeParser

    【讨论】:

    • jbbcode.com 是最好的选择。它知道标签堆叠并且不使用正则表达式。更不用说添加自定义标签是多么容易了。
    【解决方案2】:

    我自己一直在研究 bbcode 解析器。他们中的大多数使用正则表达式和 PHP4 并在 PHP 5.2+ 上产生错误或根本不工作。 PECL bbcode 和 PEAR HTML_BBCodeParser 似乎不再维护(2012 年末),并且不容易安装在我必须使用的共享主机设置上。 StringParser_BBCode 对 5.2+ 进行了一些小调整,但添加新标签的方法很笨拙,最后一次更新是在 2008 年。

    在 Bing 搜索的第 4 页(我快绝望了)我找到了jBBCode,它看起来很新,需要 PHP 5.3。麻省理工学院执照。我还没有尝试构建自定义标签,但到目前为止,它是我尝试过的唯一一个在使用 PHP 5.3 的共享主机帐户上开箱即用的标签。

    【讨论】:

    • 这篇文章已经很老了,老实说,我很惊讶它仍然相关。如果我不得不再次实施它。我不会使用正则表达式。 BBCode 可能与 html 非常相似,因为它是一种使用括号代替< 和> 的标记语言。我可能会改用 xml 解析器来检查 [ 和 ]。这样你就可以毫无问题地在 bbcode 中获得 xml 的所有好处。在解析 bbcode 时,您几乎可以做任何事情。
    【解决方案3】:

    既有pecl 和PEAR BBCode 解析库。无需重新发明您自己多年的工作,软件就足够难了。

    如果这些都不是一个选项,我会专注于将 BBCode 转换为有效的 XML 字符串,然后使用您最喜欢的 XML 解析例程。这里的想法非常粗略,但是

    1. 通过 htmlspecialchars 运行代码以转义任何需要转义的实体

    2. 将所有[和]字符分别转换为

    3. 在 [tagname:

    4. 等情况下不要忘记考虑冒号

    如果 BBCode 嵌套正确,您应该已准备好将此字符串传递到 XML 解析对象(SimpleXML、DOMDocument 等)

    【讨论】:

    • 这是一个可怕的想法。 [script] ... [/script] 会做什么?
    • 是的,如果您打算输出 HTML,那就太糟糕了。我写的是假设您正在解析 BBCode 以提取信息。如果您使用的不是官方的 BBCode 解析器(在第一段中提到),那么您一定会面临 XSS 攻击。
    • @AlanStorm 我不会这么说的。将 bbcode 解析为 xml 之类的标记实际上是一个好主意,并且不太容易受到 xss 攻击,除非您实际上并未解析内容并将标签替换为 html 标签。这不是重点。您不需要 xml 解析器将 '[' 替换为 '
    【解决方案4】:

    回应:“有更好的主意吗?” (我假设这不仅仅是为了改进 bbcode 特定建议的邀请)

    我们最近考虑采用 bbcode 路线并决定改用 htmlpurifier。该决定部分基于 htmlpurifier 组here 列出的各种方法之间的比较(诚然可能有偏见)以及对 bbcode 的讨论(同样,htmlpurifer 组)here

    我认为你的英语非常好。我敢肯定它比我用你的母语做的要好得多。

    【讨论】:

    • 啊,谢谢,我可能会包括 html 净化器。但是因为我不是真正喜欢 fck 编辑器之类的东西。我会说它主要用于净化 html 输出。但是看起来很不错。
    【解决方案5】:

    使用preg_split() 和PREG_DELIM_CAPTURE 标志将源代码分为标签和非标签。然后迭代保留打开块堆栈的标签(即,当您看到开始标签时,将其添加到数组中。当您看到结束标签时,从数组末尾删除元素,直到结束标签与开始标签匹配。)

    【讨论】:

      猜你喜欢
      • 2018-01-17
      • 1970-01-01
      • 2010-09-22
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多