Методы парсинга BBCode?

Подскажите, какие еще есть методы парсинга кроме регулярных выражений. Регулярки, как известно, не предназначены для парсинга вложенных конструкций. Если есть реализации — ткните пожалуйста.
  • Вопрос задан
  • 5038 просмотров
Решения вопроса 1
@LastDragon
Ничего сложного — достаточно создать конечный автомат… на хабре, кстати, не так давно было несколько статей по теме (если не ошибаюсь касались создания компиляторов).

Для примера:
1) Существующий парсер xbb.uz/

2) Собственный велосипед:
Код:http://pastebin.mozilla-russia.org/106940
Диаграмма: habrastorage.org/storage/b55a4b42/f4942156/b245ccd6/9426eb87.png
(оригинал в VP-UML, если кому-то будет нужна — пишите)

Скорее всего есть ошибки (сейчас как раз отлаживаю).
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
@zibada
> Регулярки, как известно, не предназначены для парсинга вложенных конструкций.

Действительно, теория нам подсказывает, что одной могучей регуляркой грамматику ббкодов не одолеть.
Но это не значит, что регулярки в данной задаче вообще применять нельзя.
(загляните в парсеры популярных форумов, например)

Вкратце — одним проходом матчим самую глубоко вложенную пару тегов и заменяем на нечто, их не содержащее, повторяем в цикле, пока находится совпадение.
Ответ написан
@Psih
Веб разработчик, совладелец Areto Development
Смотря какой язык используете. Если PHP — то есть PECL модуль bbcode. Пользуюсь — удобно, быстро, функционально за счёт callbacks и никаких извращений :)
Ответ написан
@LastDragon
> Вопрос только в скорости разбора.
Не очень быстро. Не тестировал. Тоже было бы интересно сравнить в другими вариантами парсеров.

> А конечные автоматы имхо удобнее таблицами переходов изображать
Возможно. Но диаграмма по-моему более наглядна.

> Особенно если тэги вдруг перехлестнулись
При использовании данного парсера можно как угодно обрабатывать, в данный момент вложенный незакрытый бб-код будет закрыт принудительно ([a][b][/a][/b] => [a][b][/b][/a][/b])
Ответ написан
exception13
@exception13
использовать парсер-генератор и формальное описание в РБНФ =]
Ответ написан
@LastDragon
Напишу еще один вариант*:
— Перебираем бб-коды в цикле:
1) находим открывающий тег "[bbcode"
2) находим "]" (все что между это аттрибуты)
3) если одиночный разбираем
4) если нет — ищем первый закрывающий тег "[/bbcode]"
5) все что между "[bbcode...]" и "[/bbcode]" это тело (оно форматируется в зависимости от bbкода)
6) continue;

Основная проблема в том, что невозможно определить к чему относится "]" из-за этого результат зависит от порядка разбора бб-кодов* В IPB для решения этой проблемы используется экранирование "]" в атрибутах…

* не нужно его использовать… именно так написан парсер бб-кодов в IP.Board… в нем было (да и сейчас есть) очень много ошибок из-за различного порядка вложенности bb-кодов и их атрибутов (в т.ч. XSS и падения Apache… небольшое количество подробностей можно найти на форуме IBR в постах Ritsuka)
Ответ написан
@vgrayster
Сам использую парсер xbb.uz, мне немного не понравился код который он генерирует, но после напильника все ок.

А какая вам скорость нужна? я парсю только один раз, при сохранении, потом результат кеширую и когда нужно отдаю из кеша.
Ответ написан
@LastDragon
> Т.е. IPB3 рисует html из bbcode на каждый запрос?
Да. (плюсы есть, но минусов наверное больше)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы