Я пытаюсь разобрать 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 имеет синтаксический анализатор BBCode, поэтому нет причин изобретать колесо .
Собственный парсер – это пакет PECL, поэтому вам придется его установить. Если это не вариант (например, из-за общего хостинга), есть также пакет PEAR: http://pear.php.net/package/HTML_BBCodeParser
В дополнение к этим, вы можете взглянуть на форумы, используя исходный код кода BB, и либо использовать их парсер, либо улучшить его. Существует также несколько реализаций PHP, перечисленных на http://www.bbcode.org/implementations.php
Правильный разбор BBcode с использованием регулярного выражения является несимвольным. Коды могут быть вложенными. Теги CODE
могут содержать BBCodes, которые должен игнорироваться парсером. Некоторые теги могут не отображаться внутри других тегов. и т. д. Однако это можно сделать. Недавно я переработал синтаксический анализатор BBCode для программного обеспечения форума с открытым исходным кодом FluxBB. Вы можете проверить это в действии:
Новый 2011 FluxBB Parser
Обратите внимание, что этот новый парсер еще не был включен в кодовую базу FluxBB.