我想为 PHP 网站开发 BB 代码过滤器。 (我正在使用 CakePHP,它将是 BB 代码助手)。我有以下要求:
BB 代码可以嵌套。所以这样的事情是有效的
[block]
[block]
[/block]
[block]
[block]
[/block]
[/block]
[/block]
Bbcode 可以有 0 个或多个参数。
示例:
[video: url="url", width="500", height="500"]Title[/video]
BB 代码可能有多种行为
假设
[url]text[/url]
将转换为 [url:url="text"]text[/url]
,或者视频 BB 代码将能够在 YouTube、Dailymotion 等之间进行选择。
我已经用正则表达式做了一些事情,但我最大的问题是匹配参数。事实上,我得到了嵌套的 BB 代码和带有 0 个参数的 BB 代码来工作。但是当我为参数添加正则表达式匹配时,它没有正确匹配嵌套的 BB 代码:
"\[($tag)(=.*)\"\](.*)\[\/\1\]"
(不是.*
,而是非贪婪匹配器)
我现在没有完整的正则表达式,但我有一些看起来像这样的东西(上面)。
有没有办法将 BB 代码与正则表达式或其他东西匹配?
我唯一能想到的就是使用访问者模式并用每个可能的标签分割我的文本。这样,我可以对文本解析有更多的控制,并且我可以验证我的文档,因此如果输入文本没有有效的 BB 代码...我可以在保存任何内容之前通知用户错误。
我会使用 SableCC 创建我的文本解析器。
有几个现有的库用于解析 BBCode,研究这些库可能比尝试构建自己的库更容易:
这里有几个,如果你环顾四周,我相信还有更多:
PECL bb代码
PEAR HTML_BBCodeParser
大多数 BB 代码解析器使用正则表达式和 PHP 4,并在 PHP 5.2+ 上产生错误或根本不起作用。
PECL bbcode 和 PEAR HTML_BBCodeParser 似乎不再维护(2012 年末),并且不容易安装在我必须使用的共享托管设置上。
StringParser_BBCode 适用于 5.2+ 的一些小调整,但添加新标签的方法很笨拙,最后一次更新是在 2008 年。
在 Bing 搜索的第 4 页上,我发现了 jBBCode,它看起来是新的,需要 PHP 5.3,并且处于 MIT 许可证之下。我还没有尝试构建自定义标签,但到目前为止,这是我尝试过的唯一一个可以在 PHP 5.3 的共享托管帐户上开箱即用的标签。
我们最近考虑走 BB 代码路线,并决定改用 htmlpurifier。
这个决定部分基于 htmlpurifier 小组这里列出的各种方法之间的比较(诚然是有偏见的)以及他们对 BB 代码的讨论这里。
使用
preg_split()
和 PREG_DELIM_CAPTURE
标志将源代码分为标签和非标签。然后迭代标记,保持开放块的堆栈(即,当您看到开始标记时,将其添加到数组中。当您看到结束标记时,从数组末尾删除元素,直到结束标记与开始标记匹配。)