我想要一个将 vBulletin 中的 BB 代码解析为标准 HTML 标记的函数。
不使用 PEAR 库或 PECL 扩展,因为我不想对 PEAR 大惊小怪,或者必须依赖能够在此应用程序的每个实例上安装 PECL 扩展。目标是零依赖。如果我能找到 PEAR 扩展的源代码并修改它会很好,但我似乎做不到。
特别是我遇到的麻烦是匹配[quote=My Name]
。名称“我的名字”不包含任何内容,并且可以包含空格。
一种方法是使用http://www.christian-seiler.de/projekte/php/bbcode/index_en.html
该项目页面还包含指向类似工作的链接;即使您不喜欢其中之一,也可能有用。
(简介:使用 vBulletin 开发 5 年)
与大多数正则表达式或嵌入式库相比,vBulletin 的解析器非常复杂(可能是不必要的?)。老实说,我只是挖掘它,并拿出你能做的,因为他们倾向于做一些不同的事情。如果您有一个完美工作的解析器,而无需查看它们如何自己实际生成/解析它,我会感到惊讶。
如果是旧数据,您可能只想编写自己的数据,但如果是新旧数据传入,为什么不将其缓存在 vBulletin 端并使用它们生成的数据?或者直接使用 vB_BbCode_Parser 类...
希望这可以帮助。
嗯,除了PEAR 包和PECL 扩展之外,您还有一个名为Zend_Markup的 Zend 框架包,它非常易于使用(ZF 是松散耦合的,因此您可以选择只使用该组件)。PHP Classes也有很多类。
我建议您只调整 PEAR 扩展。它不依赖于其他 PEAR 库,因此应该相当简单。
最难的方法之一是使用正则表达式:
$text = "[quote=我的名字]某事。 [b]布拉[b] blabla.[/quote]"; $search = "/\[quote=(?>([a-z0-9]*))\](.*)\[/quote\]/is"; $replace = "来自 <i>$1</i>: <q>$2</q>"; $return_text = preg_replace($search, $replace, $text); 回声 nl2br($return_text); /* 来自<i>我的名字</i>:<q>某事。 [b]布拉[b] 废话。</q> */
我之所以说最难,只是因为在那个“(。*)”上可能会发生灾难性的回溯,尤其是对于较长的文本,以及一些匹配项可能会从裂缝中溜走。因此,您可能想直接访问源代码以找到正确的正则表达式: http ://www.bbcode.org/implementations.php (请参阅:使用 PHP 的简单和复杂 BBCode用于正则表达式,phpBBCode用于源代码)。或者,您可以在此处复制和构建 Pear 的解析器源代码:http: //svn.php.net/viewvc/pear/packages/HTML_BBCodeParser