首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ragel解析HTML的问题

使用ragel解析HTML的问题
EN

Stack Overflow用户
提问于 2017-01-19 03:18:01
回答 1查看 226关注 0票数 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 )

几乎所有的工具都工作得很好(感谢这个伟大的工具!),除了一个我到目前为止还不能克服的问题:

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

代码语言: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-file:

代码语言:javascript
复制
ragel ngx_url_html_portion.rl

然后编译生成的.c-file并运行programm。

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

对任何线索都会表示由衷的感谢。

EN

回答 1

Stack Overflow用户

发布于 2017-01-21 04:46:04

定义的FSM的问题是它将所有字符都包含在“content”中,直到空格。您应该从规则中排除以'<‘开头的HTML标记。下面是说明的不同之处:

代码语言:javascript
复制
$ 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 = (
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41727678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档