Рекурсивный анализ BBCode - PullRequest
2 голосов
/ 21 июля 2011

Я пытаюсь разобрать 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',
))

Ответы [ 2 ]

6 голосов
/ 21 июля 2011

Как сказал Гордон в комментариях В PHP есть парсер BBCode, поэтому нет причин изобретать велосипед .

Хотя нативный анализатор является пакетом PECL, поэтому вам придется его установить. Если это не вариант (например, из-за общего хостинга), существует также пакет PEAR: http://pear.php.net/package/HTML_BBCodeParser

В дополнение к ним вы можете просматривать форумы, используя исходный код BB, и либо использовать их анализатор, либо улучшить его. Есть также несколько реализаций PHP, перечисленных в http://www.bbcode.org/implementations.php

0 голосов
/ 21 июля 2011

Правильный синтаксический анализ BBcode с использованием регулярных выражений нетривиален. Коды могут быть вложенными. Теги CODE могут содержать BBCodes, которые анализатор должен игнорировать. Некоторые теги могут не отображаться внутри других тегов. и т. д. Однако это можно сделать. Недавно я пересмотрел анализатор BBCode для программного обеспечения форума с открытым исходным кодом FluxBB. Вы можете проверить это в действии:

Новый анализатор FluxBB 2011 года

Обратите внимание, что этот новый синтаксический анализатор еще не был включен в кодовую базу FluxBB.

...