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

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

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

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

我的解析器可以正确提取第一个链接,但不能正确提取第二个链接。它们之间的区别在于'bbbb'and之间有空格,而 and'<a'之间没有空格。'cccc''<a'

通常,如果任何文本(空格除外)在'<a'标记之前存在,它会使解析将其视为内容,并且解析器不识别标记打开。

请在此 repo 中找到: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。

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

将真诚地感谢任何线索。

4

1 回答 1

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 = (
于 2017-01-20T20:46:03.523 回答