2017-01-18 2 views
0

В моем проекте мне нужно извлечь ссылки из HTML-документа. Для этого я подготовил Ragel HTML грамматики, прежде всего, на основе этой работы: https://github.com/brianpane/jitify-core/blob/master/src/core/jitify_html_lexer.rl (упоминается здесь: http://ragel-users.complang.narkive.com/qhjr33zj/ragel-grammars-for-html-css-and-javascript)Проблемы с разбором HTML с ragel

Почти все работает хорошо (спасибо за отличный инструмент!), За исключением одного вопроса я могу» т преодолеть на сегодняшний день:

Если я указываю этот текст в качестве вклада:

bbbb <a href="first_link.aspx"> cccc<a href="/second_link.aspx"> 

мой анализатор может корректно извлечь первую ссылку, но не второй. Разница между ними заключается в том, что между 'bbbb' и '<a' существует пробел, но нет пробелов между 'cccc' и '<a'.

В общем случае, если какой-либо текст, кроме пробелов, существует до отметки '<a', он анализирует его как содержимое, а парсер не распознает открытие тега.

В этом репо: https://github.com/amdei/ragel_html_sample умышленно упрощенный образец с грамматикой, предназначенный для работы как программа C (ngx_url_html_portion.rl). Существует также входной файл input-nbsp.html, который, как ожидается, будет содержать вход для приложения.

Для того, чтобы играть с ним, сделать .c-файл из грамматики:

ragel ngx_url_html_portion.rl 

затем компилировать в результате .c-файл и запустить программку.

Входной файл должен находиться в одном каталоге.

Будем искренне благодарны за любую подсказку.

ответ

0

Проблема с определенным FSM заключается в том, что он включает в себя содержимое всех символов до пробела. Вы должны исключить открытие HTML-тега '<' из правила. Ниже приведено различие для иллюстрации:

$ git diff 
diff --git a/ngx_url_html_portion.rl b/ngx_url_html_portion.rl 
index ccef0ca..1f8dcf0 100644 
--- a/ngx_url_html_portion.rl 
+++ b/ngx_url_html_portion.rl 
@@ -145,7 +145,7 @@ void copy2hrefbuf(par_t* par, u_char* p){ 
    ); 

    content = (
-  any - (space) 
+  any - (space) - '<' 
    )+; 

    html_space = (
Смежные вопросы