解析bbcode的最佳方法

时间:2009-01-28 19:21:58

标签: php cakephp bbcode sablecc

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

可以嵌套Bbcodes。所以这样的事情是有效的。

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

Bbcodes可以有0个或更多参数。

例如:

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

Bbcodes可能有多种行为。

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

我认为它涵盖了我的大部分需求。我总是用正则表达式做点什么。但我最大的问题是匹配参数。事实上,我得到嵌套的bbcode工作和bbcode 0参数。但是,当我为参数添加正则表达式匹配时,它与嵌套的bbcode无法正确匹配。

"\[($tag)(=.*)\"\](.*)\[\/\1\]" //不是。*而是非gready matcher

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

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

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

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

谢谢你,抱歉我的英语不好......

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:6)

peclPEAR BBCode解析库。软件很难,不需要自己重复多年的工作。

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

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

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

  3. 在[tagname:

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

    如果BBCode已正确嵌套,则应将所有设置为将此字符串传递给XML解析对象(SimpleXML,DOMDocument等)

答案 3 :(得分:3)

  

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

我们最近查看了bbcode路线并决定使用htmlpurifier代替。这个决定部分基于htmlpurifier组here列出的各种方法与bbcode(再次,htmlpurifer组)here

所讨论的各种方法之间的比较(可能有偏见)。

记录中我认为你的英语非常好。我相信这比我用你的母语做得好多了。

答案 4 :(得分:2)

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