在我的项目中,我需要从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-file:
ragel ngx_url_html_portion.rl然后编译生成的.c-file并运行programm。
输入文件应该在同一目录中。
对任何线索都会表示由衷的感谢。
发布于 2017-01-21 04:46:04
定义的FSM的问题是它将所有字符都包含在“content”中,直到空格。您应该从规则中排除以'<‘开头的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 = (https://stackoverflow.com/questions/41727678
复制相似问题