【问题标题】:Issues with parsing HTML with ragel使用 ragel 解析 HTML 的问题
【发布时间】:2017-01-18 19:18:01
【问题描述】:

在我的项目中,我需要从 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''&lt;a'之间有一个空格,而'cccc''&lt;a'之间没有空格。

一般情况下,如果在'&lt;a' 标签之前存在任何文本(空格除外),它会使解析器将其视为内容,并且解析器无法识别标签打开。

请在这个 repo 中找到:https://github.com/amdei/ragel_html_sample 有意简化的语法示例,旨在作为 C 程序 (ngx_url_html_portion.rl) 工作。 还有输入文件 input-nbsp.html ,它应该包含应用程序的输入。

为了玩它,从语法制作.c-file:

ragel ngx_url_html_portion.rl

然后编译生成的 .c 文件并运行程序。

输入文件应该在同一目录中。

如果有任何线索,我们将不胜感激。

【问题讨论】:

    标签: html parsing html-parsing ragel


    【解决方案1】:

    定义的 FSM 的问题在于它在“内容”中包含直到空格的所有字符。您应该从规则中排除打开“

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2013-12-18
      相关资源
      最近更新 更多