2017-01-18 12 views
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)ragel을 사용하여 HTML을 구문 분석 할 때의 문제점

은 거의 모두가 '내가 할 수있는 한 가지 문제를 제외하고도 (! 위대한 도구에 대한 감사) 작동 t는 현재까지 극복 :

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도 있습니다.

ragel ngx_url_html_portion.rl 

다음이 .c 파일을 결과로 컴파일을 programm을 실행

함께 플레이하기 위해, 문법 .c 인 파일을 확인하십시오.

입력 파일은 같은 디렉토리에 있어야합니다.

모든 단서에 대해 진심으로 감사드립니다.

답변

0

정의 된 FSM의 문제는 공간까지 모든 문자를 '내용'에 포함한다는 것입니다. HTML 태그 열기 '<'을 규칙에서 제외해야합니다. 다음은 그림의 diff입니다.

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