Php 解析bbcode的最佳方法

Php 解析bbcode的最佳方法,php,cakephp,bbcode,sablecc,Php,Cakephp,Bbcode,Sablecc,我想为一个php网站设计一个bbcode过滤器。我使用的是cakephp,它将是bbcode的助手 我有一些要求 BBCODE可以嵌套。所以类似的东西是有效的 BBCODE可以有0个或多个参数 例如: [video: url="url", width="500", height="500"]Title[/video] BBCODE可能具有多种行为 比如说,[url]text[/url]将被转换为[url:url=text]text[/url] 或者视频bbcode可以在youtube、dail

我想为一个php网站设计一个bbcode过滤器。我使用的是cakephp,它将是bbcode的助手 我有一些要求

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

BBCODE可以有0个或多个参数

例如:

[video: url="url", width="500", height="500"]Title[/video]
BBCODE可能具有多种行为

比如说,[url]text[/url]将被转换为[url:url=text]text[/url] 或者视频bbcode可以在youtube、dailymotion

我想它满足了我的大部分需求。我真的对regex做了些什么。但我最大的问题是匹配参数。事实上,我得到了嵌套的bbcode,并且bbcode有0个参数。但当我为参数添加正则表达式匹配时,它与嵌套的bbcode不匹配

\[$tag=.\\\].\[\/\1\]//它不是。*而是非格雷迪匹配器

我现在没有完整的正则表达式,但我有上面这样的东西

那么有没有一种方法可以有效地将bbcode与regex或其他东西匹配呢。 我能想到的唯一一件事是使用访问者模式,并用每个可能的标记分割文本。这样,我可以对文本解析有更多的控制,并且我可能会验证我的文档,因此如果输入文本没有有效的bbcode。我可以在保存任何内容之前通知用户一个错误

我将使用sablecc创建我的文本解析器。

还有更好的主意吗?或者任何能够产生高效灵活的bbcode解析器的东西

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

回答:还有更好的主意吗?我认为这不仅仅是为了改进bbcode特定的建议

我们最近考虑过使用bbcode路线,并决定改用它。这一决定部分基于htmlpurifer小组列出的各种方法之间公认的有偏见的比较,以及htmlpurifer小组对bbcode的再次讨论


我认为你的英语非常好。我相信这比我用你的母语所能做的要好得多。

有几个用于解析BBCode的现有库,研究这些库可能比尝试使用你自己的库更容易:

这里有几个,如果你环顾四周,我相信还有更多:

有一个和BBCode解析库。软件已经够难的了,不用自己花上几年的时间来改造

如果这两个都不是选项,我将集中精力将BBCode转换为有效的XML字符串,然后在此基础上使用您最喜欢的XML解析例程。这里的想法很粗略,但是

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

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

在[tagname:


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

使用preg_split with preg_DELIM_CAPTURE标志将源代码拆分为标记和非标记。然后在标记上进行迭代,保持打开块的堆栈,即当您看到开始标记时,将其添加到数组中。当您看到osing标记,从数组末尾移除元素,直到结束标记与开始标记匹配。

我一直在研究bbcode解析器。它们中的大多数使用regex和PHP4,在PHP 5.2+上产生错误或根本不起作用。PECL bbcode和PEAR HTML_BBCodeParser似乎在2012年后期不再维护,也不容易安装在共享数据库上我必须使用的主机设置。对5.2+进行了一些小的调整,但是添加新标签的方法很笨拙,最后一次更新是在2008年


隐藏在Bing搜索的第4页,我发现它看起来很新,需要PHP5.3。MIT Lisence。我还没有尝试构建自定义标记,但到目前为止,它是我唯一一个在PHP5.3共享主机帐户上开箱即用的工具。

啊,谢谢你,我可能会包括html净化器。但是因为我不是fck编辑器之类的东西的粉丝。我想说,它主要用于净化html输出。但它看起来非常好。这是一个可怕的想法。什么是[script]…[/script]是吗?是的,如果你打算将HTML输出回去,那就太糟糕了。我写的是假设你正在解析BBCode以提取信息。如果你使用的不是第一段中提到的官方BBCode解析器,那么你肯定会受到XSS攻击。@AlanStorm我不会这么说。像m一样将BBCode解析为xmlarkup实际上是一个好主意,不太容易受到xss攻击,除非您不是真正解析内容,只是将标记替换为html标记。这不是重点。您不需要xml解析器来替换['by'这篇文章已经很老了,老实说,我很惊讶它仍然有用。如果我必须再次实现它,我不会使用regexes。BBCode可以非常类似于html,因为 这是一种使用括号而不是括号的标记语言。我可能会改为使用xml解析器来检查[和]。这样,您就可以在bbcode中获得xml的所有好处,而不会有太多问题。在解析bbcode时,您几乎可以做任何事情。这是最好的选择。它知道标记堆叠,不使用正则表达式。更不用说添加自定义标记是多么容易了。
[video: url="url", width="500", height="500"]Title[/video]