使用ABAP正則表達式解析HTML標籤

需求就是我用ABAP的某個函數從數據庫讀取一個字符串出來,該字符串的內容是一個網頁。正則表達式

網頁的form裏包含了不少隱藏的input field。個人任務是解析出name爲svyValueGuid的input field的值:FA163EEF573D1ED89E89C7FE5E7C4715數據庫

最簡單粗暴的作法是:利用ABAP的FIND FIRST OCCURRENCE關鍵字首先找到svyValueGuid的偏移量,而後從這個偏移量出發,再找到第一個>的偏移量,這樣問題就化簡爲在子串type="hidden" value="FA163EEF573D1ED89E89C7FE5E7C4715",這樣問題就簡單多了。可是這種辦法比較笨重,代碼很冗餘。express

有沒有更快捷的辦法呢?那就是使用ABAP regular expression,即正則表達式。函數

請看下列的測試代碼:測試

REPORT ztest_interface.

DATA: lv_input TYPE string,

reg_pattern TYPE string.

lv_input = `<body>` &&

`<div class="Title">Jerry's Programming Skill survey</div>` &&

`<form action="Survey.htm?sap-client=001">` &&

`<input name="svyApplicationId" type="hidden" value="CRM_SURVEY_ACTIVITY">` &&

`<input name="svyValueGuid" type="hidden" value="FA163EEF573D1ED89E89C7FE5E7C4715">` &&

`<input name="SurveyId" type="hidden" value="JERRY_TEST">` &&

`<div Id="" class="Section1">` && `</form></body>`.

reg_pattern = '.*svyValueGuid(?:.*)value="(.*)">.*SurveyId.*'.

TRY.

DATA(lo_regex) = NEW cl_abap_regex( pattern = reg_pattern ).

DATA(lo_matcher) = lo_regex->create_matcher( EXPORTING text = lv_input ).

IF lo_matcher->match( ) <> abap_true.

WRITE:/ 'fail in input scan!'.

RETURN.

ENDIF.

DATA(lt_reg_match_result) = lo_matcher->find_all( ).

READ TABLE lt_reg_match_result ASSIGNING FIELD-SYMBOL(<match>) INDEX 1.

READ TABLE <match>-submatches ASSIGNING FIELD-SYMBOL(<sub>) INDEX 1.

data(lv_sub) = lv_input+<sub>-offset(<sub>-length).

WRITE:/ 'result: ', lv_sub.

CATCH cx_root INTO DATA(cx_root).

WRITE:/ cx_root->get_text( ).

RETURN.

ENDTRY.

執行結果:ui

解決問題的核心思路是這個正則表達式:*.svyValueGuid(?:.)value="(.)">.SurveyId.code

經過捕獲分組操做符,一對小括號,將32位的GUID值進行捕獲。這種解法比FIND FIRST OCCURANCE的代碼量要少。orm

要獲取更多Jerry的原創技術文章,請關注公衆號"汪子熙"或者掃描下面二維碼:htm

相關文章
相關標籤/搜索