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

Подскажите, какие еще есть методы парсинга кроме регулярных выражений. Регулярки, как известно, не предназначены для парсинга вложенных конструкций. Если есть реализации — ткните пожалуйста.
  • Вопрос задан
  • 5039 просмотров
Решения вопроса 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 на каждый запрос?
Да. (плюсы есть, но минусов наверное больше)
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы