Intereting Posts

Лучший способ разбора bbcode

Я хотел бы работать с фильтром bbcode для веб-сайта php. (Я использую cakephp, это будет помощник bbcode) У меня есть какое-то требование.

Bbcodes могут быть вложенными. Так что это действительно так.

[block] [block] [/block] [block] [block] [/block] [/block] [/block] 

Bbcodes могут иметь 0 или более параметров.

Exemple:

 [video: url="url", width="500", height="500"]Title[/video] 

Bbcodes могут иметь множественное поведение.

Скажем, [url]text[/url] будет преобразован в [url:url="text"]text[/url] или видео bbcode сможет выбирать между youtube, dailymotion ….

Я думаю, что это покрывает большинство моих потребностей. Я вообще делал что-то с регулярным выражением. Но моя самая большая проблема заключалась в том, чтобы соответствовать параметрам. Фактически, я получил вложенный bbcode для работы и bbcode с 0 параметрами. Но когда я добавил регулярное выражение для параметров, он не соответствовал вложенному bbcode правильно.

"\[($tag)(=.*)\"\](.*)\[\/\1\]" // Это не так. * но несовместимый созреватель

У меня нет полного регулярного выражения со мной прямо сейчас, но у меня было что-то похожее на это (выше).

Итак, есть способ эффективно сочетать bbcode с регулярным выражением или чем-то еще. Единственное, что я могу придумать, это использовать шаблон посетителя и разделить текст с каждым возможным тегом таким образом, я могу немного контролировать свой синтаксический анализ текста, и я мог бы, вероятно, проверить мой документ, поэтому, если входной текст не работает У вас есть действительный bbcode. Я мог бы уведомить пользователя об ошибке перед тем, как сохранить что-либо.

Я бы использовал sablecc для создания моего синтаксического анализатора. http://sablecc.org/

Любая лучшая идея? или что-нибудь, что может привести к эффективному гибкому парсеру bbcode?

Благодарю вас и извините за мой плохой английский …

В библиотеке синтаксического анализа используется библиотека pecl и PEAR BBCode. Программное обеспечение достаточно сложно, не заново изобретая годы работы самостоятельно.

Если ни один из них не является вариантом, я бы сосредоточился на превращении BBCode в действительную строку XML, а затем с помощью вашей любимой процедуры синтаксического анализа XML. Очень грубая идея здесь, но

  1. Запустите код через htmlspecialchars, чтобы избежать любых объектов, которым требуется экранирование

  2. Преобразуйте все символы [и] в <и> соответственно

  3. Не забудьте указать двоеточие в таких случаях, как [тэг:

Если BBCode был вложен правильно, вы должны быть настроены передать эту строку в XML-синтаксический объект (SimpleXML, DOMDocument и т. Д.),

Существует несколько существующих библиотек для синтаксического анализа BBCode, возможно, будет проще изучить те, которые вы пытаетесь опрокинуть самостоятельно:

Вот пара, я уверен, что есть больше, если вы посмотрите вокруг:
PECL bbcode
PEAR HTML_BBCodeParser

Я сам разбирался в парсерах bbcode. Большинство из них используют регулярные выражения и PHP4 и создают ошибки на PHP 5.2+ или вообще не работают. PECL bbcode и PEAR HTML_BBCodeParser больше не поддерживаются (в конце 2012 года) и не могут быть легко установлены в настройках совместного хостинга, с которыми я должен работать. StringParser_BBCode работает с некоторыми незначительными изменениями для 5.2+, но метод добавления новых тегов неуклюж, и последний раз он был обновлен в 2008 году.

Похороненный на 4-й странице поиска Bing (я получал отчаяние), я нашел jBBCode , который выглядит новым и требует PHP 5.3. MIT Lisence. Мне еще предстоит создать пользовательские теги, но пока это единственный, который я пробовал, который работает из коробки на общей учетной записи хостинга с PHP 5.3.

Отвечая на вопрос: «Лучшая идея?» (и я предполагаю, что это было приглашение не только для улучшения по сравнению с предложениями, специфичными для bbcode)

Недавно мы посмотрели на маршрут bbcode и решили использовать htmlpurifier . Это решение было частично основано на (предположительно смещенном) сопоставлении между различными методами, перечисленными здесь группой htmlpurifier, и обсуждением bbcode (опять же, группой htmlpurifer) здесь

И для записи я думаю, что ваш английский был очень хорош. Я уверен, что это намного лучше, чем я мог сделать на вашем родном языке.

Используйте preg_split() с флагом PREG_DELIM_CAPTURE чтобы разделить исходный код на теги и теги. Затем перебирайте теги, сохраняя стек открытых блоков (т. Е. Когда вы видите открывающий тег, добавьте его в массив. Когда вы увидите закрывающий тег, удалите элементы из конца массива, пока закрывающий тег не совпадёт с открывающим тегом).