parsingbbcode的最佳方法

我想在一个php网站的bbcodefilter上工作。 (我使用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]或者videobbcode将能够在youtube,dailymotion之间进行select….

我认为它涵盖了我的大部分需求。 我alreay正则expression式做了一些事情。 但我最大的问题是匹配参数。 事实上,我得到了嵌套的bbcode工作和bbcode 0参数。 但是,当我添加了正则expression式匹配的参数,它不正确匹配嵌套的bbcode。

"\[($tag)(=.*)\"\](.*)\[\/\1\]" //不是。*但是没有gready匹配器

我现在还没有完整的正则expression式,但是我看起来像这样(上图)。

那么有没有办法有效地匹配bbcode与正则expression式或其他东西。 我唯一能想到的就是使用访问者模式,并用这种方式分割我的文本和每个可能的标签,我可以有更多的控制我的文本parsing,我可以validation我的文档,所以如果input文本doesn没有有效的bbcode。 我可以在保存任何东西之前通知用户有错误。

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

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

谢谢你,抱歉我的英文不好

pecl和PEAR都有一个BBCodeparsing库。 软件很难,而不需要自己重新开展多年的工作。

如果这两者都不是一个选项,我会专注于将BBCode转换为有效的XMLstring,然后使用您最喜欢的XMLparsing例程。 这里非常非常粗糙的想法,但是

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

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

  3. 不要忘记在[tagname:

如果BBCode被正确嵌套,你应该被设置为将这个string传递给一个XMLparsing对象(SimpleXML,DOMDocument等)

有几个parsingBBCode的现有库,可能比试图推出自己的更容易:

这里有一对夫妇,我相信如果你环顾四周,
PECL bbcode
PEAR HTML_BBCodeParser

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

埋在必应search的第4页(我越来越绝望),我发现jBBCode ,它看起来是新的,需要PHP 5.3。 MIT Lisence。 我还没有尝试构build自定义标签,但到目前为止,这是我尝试过的在PHP 5.3共享主机帐户上开箱即用的唯一一个。

回应:“有什么更好的主意? (我假设这是一个邀请,不仅仅是为了改进特定于bbcode的build议)

我们最近看了去bbcode的路线,并决定使用htmlpurifier 。 这个决定部分是基于htmlpurifier组列出的各种方法(可能是有偏见的)的比较,以及这里讨论的bbcode(同样由htmlpurifer组)

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

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