• 使用ABAP正则表达式解析HTML标签


    需求就是我用ABAP的某个函数从数据库读取一个字符串出来,该字符串的内容是一个网页。

    网页的form里包含了很多隐藏的input field。我的任务是解析出name为svyValueGuid的input field的值:FA163EEF573D1ED89E89C7FE5E7C4715

    最简单粗暴的做法是:利用ABAP的FIND FIRST OCCURRENCE关键字首先找到svyValueGuid的偏移量,然后从这个偏移量出发,再找到第一个>的偏移量,这样问题就化简为在子串type="hidden" value="FA163EEF573D1ED89E89C7FE5E7C4715",这样问题就简单多了。但是这种办法比较笨重,代码很冗余。

    有没有更快捷的办法呢?那就是使用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.
    

    执行结果:

    解决问题的核心思路是这个正则表达式:.svyValueGuid(?:.)value="(.)">.SurveyId.*

    通过捕获分组操作符,一对小括号,将32位的GUID值进行捕获。这种解法比FIND FIRST OCCURANCE的代码量要少。

    要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

  • 相关阅读:
    微信网页授权功能来获取用户信息(昵称或头像)之php实现
    你人生的那口井挖好了吗?
    java项目打jar包
    Oracle 客户端配置笔记
    资源管理右键卡住的问题
    Java Web 项目学习(二) 开发注册功能
    Java Web 项目学习(三) 过滤敏感词 前缀树 反射 类加载
    Java Web 项目学习(二) 检查登录状态
    Java Web 项目学习(二)账号设置
    Java Web 项目学习(二) 显示登录信息
  • 原文地址:https://www.cnblogs.com/sap-jerry/p/9819616.html
Copyright © 2020-2023  润新知