提取html页面的所有标签

时间:2018-01-05 17:41:54

标签: java regex

我会尝试获取包含页面内容(String)的所有标签。 到目前为止我的正则表达式不够精确如下: "< + GT;&#34(。+?);

这将匹配以下内容:

<p>Il <b>1943</b>       (wrong)
<b>1943</b>             (correct)
<p>Il <b>1943</b></p>   (correct)

如何指定正则表达式仅匹配标记,开始和结束标记是相同的?

public static List<String> getAllTags(String html){
    List<String> listTags=new ArrayList<String>();
    Pattern p = Pattern.compile("<.+>(.+?)</.+>");
    Matcher m = p.matcher(html);
    while(m.find()) {
        String tag = m.group(1);
        String teststring = m.group();
        listTags.add(teststring );
        System.out.println(teststring );
    }
    return listTags;
}

1 个答案:

答案 0 :(得分:0)

如果你只想获得内部标签和内容,这是有效的 (请注意,如果Java可以进行递归,则可以使用嵌套匹配标记 不幸的是,它没有进行递归)

谨防使用正则表达式解析html,这是危险的。

"<(?>([\\w:]+)\\b(?:\"[\\S\\s]*?\"|'[\\S\\s]*?'|[^>]?)+)>(?:(?!<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\\s+(?>\"[\\S\\s]*?\"|'[\\S\\s]*?'|(?:(?!/>)[^>])?)+)?\\s*>)[\\S\\s]*?</\\2\\s*(?=>))|(?:/?[\\w:]+\\s*/?)|(?:[\\w:]+\\s+(?:\"[\\S\\s]*?\"|'[\\S\\s]*?'|[^>]?)+\\s*/?)|\\?[\\S\\s]*?\\?|(?:!(?:(?:DOCTYPE[\\S\\s]*?)|(?:\\[CDATA\\[[\\S\\s]*?\\]\\])|(?:--[\\S\\s]*?--)|(?:ATTLIST[\\S\\s]*?)|(?:ENTITY[\\S\\s]*?)|(?:ELEMENT[\\S\\s]*?))))>)[\\S\\s])*?<(?:/\\1\\b\\s*)>"

演示:https://regex101.com/r/I0NgZZ/1

刮刀系列
格式化(没有解释):

 <
 (?>
      ( [\w:]+ )                    # (1)
      \b 
      (?:
           " [\S\s]*? " 
        |  ' [\S\s]*? ' 
        |  [^>]? 
      )+
 )
 > 
 (?:
      (?!
           <
           (?:
                (?:
                     (?:
                          # Invisible content; end tag req'd
                          (                             # (2 start)
                               script
                            |  style
                            |  object
                            |  embed
                            |  applet
                            |  noframes
                            |  noscript
                            |  noembed 
                          )                             # (2 end)
                          (?:
                               \s+ 
                               (?>
                                    " [\S\s]*? "
                                 |  ' [\S\s]*? '
                                 |  (?:
                                         (?! /> )
                                         [^>] 
                                    )?
                               )+
                          )?
                          \s* >
                     )

                     [\S\s]*? </ \2 \s* 
                     (?= > )
                )

             |  (?: /? [\w:]+ \s* /? )
             |  (?:
                     [\w:]+ 
                     \s+ 
                     (?:
                          " [\S\s]*? " 
                       |  ' [\S\s]*? ' 
                       |  [^>]? 
                     )+
                     \s* /?
                )
             |  \? [\S\s]*? \?
             |  (?:
                     !
                     (?:
                          (?: DOCTYPE [\S\s]*? )
                       |  (?: \[CDATA\[ [\S\s]*? \]\] )
                       |  (?: -- [\S\s]*? -- )
                       |  (?: ATTLIST [\S\s]*? )
                       |  (?: ENTITY [\S\s]*? )
                       |  (?: ELEMENT [\S\s]*? )
                     )
                )
           )
           >
      )
      [\S\s] 
 )*?
 <
 (?: / \1 \b \s* )
 >