Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6085
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Методы парсинга BBCode?
Просмотров: 410
 
Ответов: 8
Подскажите, какие еще есть методы парсинга кроме регулярных выражений. Регулярки, как известно, не предназначены для парсинга вложенных конструкций. Если есть реализации — ткните пожалуйста.
Ничего сложного — достаточно создать конечный автомат… на хабре, кстати, не так давно было несколько статей по теме (если не ошибаюсь касались создания компиляторов).
Для примера:
1) Существующий парсер xbb.uz/
2) Собственный велосипед:
Код:http://pastebin.mozilla-russia.org/106940
Диаграмма: habrastorage.org/storage/b55a4b42/f4942156/b245ccd6/9426eb87.png
(оригинал в VP-UML, если кому-то будет нужна — пишите)
Скорее всего есть ошибки (сейчас как раз отлаживаю).
> Регулярки, как известно, не предназначены для парсинга вложенных конструкций.
Действительно, теория нам подсказывает, что одной могучей регуляркой грамматику ббкодов не одолеть.
Но это не значит, что регулярки в данной задаче вообще применять нельзя.
(загляните в парсеры популярных форумов, например)
Вкратце — одним проходом матчим самую глубоко вложенную пару тегов и заменяем на нечто, их не содержащее, повторяем в цикле, пока находится совпадение.
Смотря какой язык используете. Если PHP — то есть PECL модуль bbcode. Пользуюсь — удобно, быстро, функционально за счёт callbacks и никаких извращений :)
> Вопрос только в скорости разбора.
Не очень быстро. Не тестировал. Тоже было бы интересно сравнить в другими вариантами парсеров.
> А конечные автоматы имхо удобнее таблицами переходов изображать
Возможно. Но диаграмма по-моему более наглядна.
> Особенно если тэги вдруг перехлестнулись
При использовании данного парсера можно как угодно обрабатывать, в данный момент вложенный незакрытый бб-код будет закрыт принудительно ([a][b][/a][/b] => [a][b][/b][/a][/b])
Напишу еще один вариант*:
— Перебираем бб-коды в цикле:
1) находим открывающий тег "[bbcode"
2) находим "]" (все что между это аттрибуты)
3) если одиночный разбираем
4) если нет — ищем первый закрывающий тег "[/bbcode]"
5) все что между "[bbcode...]" и "[/bbcode]" это тело (оно форматируется в зависимости от bbкода)
6) continue;
Основная проблема в том, что невозможно определить к чему относится "]" из-за этого результат зависит от порядка разбора бб-кодов* В IPB для решения этой проблемы используется экранирование "]" в атрибутах…
* не нужно его использовать… именно так написан парсер бб-кодов в IP.Board… в нем было (да и сейчас есть) очень много ошибок из-за различного порядка вложенности bb-кодов и их атрибутов (в т.ч. XSS и падения Apache… небольшое количество подробностей можно найти на форуме IBR в постах Ritsuka)
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться