【问题标题】:Recursive BBCode Parsing递归 BBCode 解析
【发布时间】:2011-10-10 00:48:07
【问题描述】:

我正在尝试在我的脚本中解析 BBCode。现在,它无缝地工作,直到我尝试缩进不仅仅是粗体或下划线的 BBCode - 例如扰流板、url、字体大小等 - 然后它就搞砸了。这是我的代码:

function parse_bbcode($text) {
    global $db;
    $oldtext = $text;
    $bbcodes = $db->select('*', 'bbcodes');
    foreach ($bbcodes as $bbcode) {
        switch ($bbcode->type) {
            case 'simple': {
                $find = '{content}';
                $replace = '${1}';
                $text = preg_replace(
                    '/\['.$bbcode->tag.'\](.+)\[\/'.$bbcode->tag.'\]/i',
                    str_replace($find, $replace, $bbcode->html),
                    $text);
                    break;
            }
            case 'property':
            case 'options': {
                $find = array ( '{property}', '{content}' );
                $replace = array ( '${1}', '${2}' );
                $text = preg_replace(
                    '/\['.$bbcode->tag.'\=(.[^\"]*)\](.+)\[\/'.$bbcode->tag.'\]/i',
                    str_replace($find, $replace, $bbcode->html),
                    $text);
                    break;
            }
        }
    }
    return $text;
}

现在我的猜测是 RegEx 不喜欢模式中的递归性。我该如何改进它?示例 $bbcode 对象如下:

stdClass::__set_state(array(
   'id' => '2',
   'name' => 'Italic',
   'type' => 'simple',
   'tag' => 'i',
   'button_image' => NULL,
   'button_text' => '<i>I</i>',
   'options' => '',
   'prompt' => NULL,
   'html' => '<i>{content}</i>',
   'order' => '1',
))
stdClass::__set_state(array(
   'id' => '3',
   'name' => 'URL',
   'type' => 'property',
   'tag' => 'url',
   'button_image' => NULL,
   'button_text' => 'http://',
   'options' => '',
   'prompt' => 'URL address',
   'html' => '<a href="{property}">{content}</a>',
   'order' => '4',
))

【问题讨论】:

标签: php regex bbcode


【解决方案1】:

正如 gordon 在 cmets PHP has a BBCode parser, so no reason to reinvent the wheel 中所说的那样。

本机解析器是一个 PECL 包,因此您必须安装它。如果这不是一个选项(例如由于共享主机),还有一个 PEAR 包:http://pear.php.net/package/HTML_BBCodeParser

除此之外,您还可以查看使用 BB 代码源代码的论坛,并使用他们的解析器或改进它。 http://www.bbcode.org/implementations.php

中还列出了几个 PHP 实现

【讨论】:

  • PECL 包看起来很棒,但我无法安装它... PEAR 包很蹩脚:/
【解决方案2】:

使用正则表达式正确解析 BBcode 并非易事。代码可以嵌套。 CODE 标签可能包含解析器必须忽略的 BBCode。某些标签可能不会出现在其他标签内。等等。但是,它可以做到。我最近彻底检查了 FluxBB 开源论坛软件的 BBCode 解析器。你可能想看看它的实际效果:

New 2011 FluxBB Parser

请注意,此新解析器尚未合并到 FluxBB 代码库中。

【讨论】:

  • 这是否完全可操作?以及如何轻松添加自己的 BBCode?​​span>
  • 是的,它可以运行(上面的链接是一个使用这个解析器的测试论坛)。这不是通用解析器 - 它专门设计用于 FluxBB。您需要阅读documentationsource code。我假设您是 PHP 程序员并且熟悉 regular expressions。正如我所说,解析 BBCode 并非易事。
  • 是的,我熟悉 PHP 和 RegEx(见问题),但是 BBCode 很容易解析——直到它变得递归
  • @OhMrBigshot:问题的复杂性不仅限于递归,还在于标签如何相互嵌套。例如您是否允许在IMG 标签内使用URL 标签?或者在I 标签内允许QUOTE 标签怎么样?您需要建立一个规则系统(与 HTML 平行),定义允许嵌套在每个标签内的内容。此外,需要有允许的父标签的规则,例如LI(或*)标签只能出现在LIST标签内。
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
相关资源
最近更新 更多