使用ragel解析HTML的问题

时间:2017-01-18 19:18:01

标签: html parsing html-parsing ragel

在我的项目中,我需要从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

几乎一切都运作良好(感谢伟大的工具!),除了迄今为止我无法克服的一个问题:

如果我将此文本指定为输入:

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文件并运行programm。

输入文件应位于同一目录中。

真诚地感谢任何线索。

1 个答案:

答案 0 :(得分:0)

定义的FSM的问题在于它包含所有字符的“内容”直到空格。你应该排除HTML标签打开'&lt;'从规则。以下是差异说明:

$ 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 = (