Лучший способ разобрать 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?
Спасибо вам и извините за мой плохой английский...
Решение
Там есть и то, и другое пекл и ГРУША Библиотека синтаксического анализа BBCode.Программное обеспечение достаточно сложное, и вам не нужно изобретать заново годы работы самостоятельно.
Если ни один из этих вариантов не подходит, я бы сосредоточился на превращении BBCode в допустимую XML-строку, а затем использовал для этого вашу любимую процедуру синтаксического анализа XML.Здесь очень, очень приблизительная идея, но
Запустите код через htmlspecialchars, чтобы избежать любых объектов, которые нуждаются в экранировании
Преобразуйте все символы [ и ] в < и > соответственно
Не забывайте указывать двоеточие в таких случаях, как [tagname:
Если BBCode был вложен правильно, у вас должно быть все готово для передачи этой строки в объект синтаксического анализа XML (SimpleXML, DOMDocument и т.д.).
Другие советы
Существует несколько существующих библиотек для синтаксического анализа BBCode, возможно, будет проще заглянуть в них, чем пытаться создать свою собственную:
Вот пара, я уверен, что есть и другие, если вы посмотрите вокруг:
PECL bbcode ( Код )
PEAR html_bbbcodeparser - анализатор ГРУШЕВОГО кода
Сам изучал парсеры bbcode.Большинство из них используют regex и PHP4 и выдают ошибки на PHP 5.2+ или вообще не работают.PECL bbcode и PEAR HTML_BBCodeParser, похоже, больше не поддерживаются (конец 2012 года) и их нелегко установить на общий хостинг, с которым мне приходится работать. StringParser_BBCode работает с некоторыми незначительными изменениями для версии 5.2+, но метод добавления новых тегов неуклюж, и в последний раз он обновлялся в 2008 году.
Похоронен на 4-й странице поиска в Bing (я был в отчаянии) Я нашел JBB - код, который выглядит новым и требует PHP 5.3.МИТ Лизенс.Я еще не пробовал создавать пользовательские теги, но пока это единственное, что я пробовал, которое работает "из коробки" в общей учетной записи хостинга с PHP 5.3.
Реагируя на:"Есть идея получше?" (и я предполагаю, что это было приглашение не только для улучшения по сравнению с предложениями, специфичными для bbcode)
Недавно мы рассмотрели возможность перехода по маршруту bbcode и решили использовать htmlочиститель вместо этого.Это решение было частично основано на (по общему признанию, вероятно, предвзятом) сравнении различных методов, перечисленных группой htmlpurifier здесь и обсуждение bbcode (опять же, группой htmlpurifer) здесь
И для протокола, я думаю, что ваш английский был очень хорош.Я уверен, что это намного лучше, чем я мог бы сделать на вашем родном языке.
Использование preg_split()
с PREG_DELIM_CAPTURE
установите флажок для разделения исходного кода на теги и не-теги.Затем выполните итерацию по тегам, сохраняя стопку открытых блоков (т.е.когда вы увидите открывающий тег, добавьте его в массив.Когда вы увидите закрывающий тег, удаляйте элементы из конца массива до тех пор, пока закрывающий тег не совпадет с открывающим тегом.)