Java 提取html页面的所有标记

Java 提取html页面的所有标记,java,regex,Java,Regex,我将尝试获取包含页面字符串内容的所有标记。 到目前为止,我的正则表达式不够精确,如下所示: .+ 这将符合以下条件: <p>Il <b>1943</b> (wrong) <b>1943</b> (correct) <p>Il <b>1943</b></p> (correct) 如何指定正则表达式以仅匹配标记,哪些开始标记和结束标记是相同的 publ

我将尝试获取包含页面字符串内容的所有标记。 到目前为止,我的正则表达式不够精确,如下所示: .+

这将符合以下条件:

<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;
}

如果您只想获取内部标记和内容,那么这是可行的。 请注意,如果Java可以执行递归,则可以使用嵌套的匹配标记。 不幸的是,它不做递归

小心使用正则表达式解析html,这很危险

[\\w:][+\\b?:\[\\S\\S]*?\\\\\'[\\S]*?'\\\\\\\\\\\\\\\\\'[\\S]*?'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[\\S\\S]*?\\\\\''[\\S\\S]*?'?:?!/>[^>]?+?\\s*>[\\s\\s]*?:/?[\\w:][+\\s*/?:[\\w:][+\\s+?:\[\\s\\s]*?\*?'[\\s\\s]*?'.[^>]+\\s*/?\?[\\s]*?\?[\\s]*?\?:!?::DOCTYPE[\\S\\S]*?\124;?:\\[CDATA\\[[\\S\\S]*?\\]\\\]\]\124;?:-[\\ S\\S]*?-\124;?:ATTLIST[\\S\\S]*?\124;?:实体[\\S\\S]*?:元素[\\S]*?>[\\S\\S]*

演示:

刮刀系列 没有解释的格式:

 <
 (?>
      ( [\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* )
 >

您可能对此感兴趣:当我们有了正则表达式模式时,没有理由使用正则表达式模式来解析Java中的HTML,这在现实世界的HTML中非常有效