Я хотел бы работать с фильтром 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. Очень грубая идея здесь, но
Запустите код через htmlspecialchars, чтобы избежать любых объектов, которым требуется экранирование
Преобразуйте все символы [и] в <и> соответственно
Не забудьте указать двоеточие в таких случаях, как [тэг:
Если 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
чтобы разделить исходный код на теги и теги. Затем перебирайте теги, сохраняя стек открытых блоков (т. Е. Когда вы видите открывающий тег, добавьте его в массив. Когда вы увидите закрывающий тег, удалите элементы из конца массива, пока закрывающий тег не совпадёт с открывающим тегом).