本文主要介绍Java中,解析html字符串的方法,也就是将html字符串中html标签代码(html、js(javascript)、css等)去掉删除,转换成纯文本内容,以及相关的示例代码。

1、删除去掉html标签的正则表达式

1) 第一种正则表达式

html.replaceAll("(?is)<!DOCTYPE.*?>", "");
html.replaceAll("(?is)<!--.*?-->", "");				// remove html comment
html.replaceAll("(?is)<script.*?>.*?</script>", ""); // remove javascript
html.replaceAll("(?is)<style.*?>.*?</style>", "");   // remove css

2) 第二种正则表达式

String regEx_script = "<[//s]*?script[^>]*?>[//s//S]*?<[//s]*?///[//s]*?script[//s]*?>"; // 定义script的正则表达式{或<script[^>]*?>[//s//S]*?<///script>    
String regEx_style = "<[//s]*?style[^>]*?>[//s//S]*?<[//s]*?///[//s]*?style[//s]*?>"; // 定义style的正则表达式{或<style[^>]*?>[//s//S]*?<///style>    
String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式    
String regEx_htmlvalate = "<[^>]+";

2、解析删除去掉html标签的完整代码

public String select(String html) {
      html = html.replaceAll("(?is)<!DOCTYPE.*?>", "");
      html = html.replaceAll("(?is)<!--.*?-->", "");				// remove html comment
      html = html.replaceAll("(?is)<script.*?>.*?</script>", ""); // remove javascript
      html = html.replaceAll("(?is)<style.*?>.*?</style>", "");   // remove css
      html = html.replaceAll("&.{2,5};|&#.{2,5};", " ");			// remove special char
      html = html.replaceAll("(?is)<.*?>", "");
      List<String> lines;
      int blocksWidth =3;
      int threshold =86;
      int start;
      int end;
      StringBuilder text = new StringBuilder();
      ArrayList<Integer> indexDistribution = new ArrayList<Integer>();
      lines = Arrays.asList(html.split("\n"));
      for (int i = 0; i < lines.size() - blocksWidth; i++) {
          int wordsNum = 0;
          for (int j = i; j < i + blocksWidth; j++) {
              lines.set(j, lines.get(j).replaceAll("\\s+", ""));
              wordsNum += lines.get(j).length();
          }
          indexDistribution.add(wordsNum);
      }
      start = -1; end = -1;
      boolean boolstart = false, boolend = false;
      text.setLength(0);
      for (int i = 0; i < indexDistribution.size() - 1; i++) {
          if (indexDistribution.get(i) > threshold && ! boolstart) {
              if (indexDistribution.get(i+1).intValue() != 0
                      || indexDistribution.get(i+2).intValue() != 0
                      || indexDistribution.get(i+3).intValue() != 0) {
                  boolstart = true;
                  start = i;
                  continue;
              }
          }
          if (boolstart) {
              if (indexDistribution.get(i).intValue() == 0
                      || indexDistribution.get(i+1).intValue() == 0) {
                  end = i;
                  boolend = true;
              }
          }
          StringBuilder tmp = new StringBuilder();
          if (boolend) {
              //System.out.println(start+1 + "\t\t" + end+1);
              for (int ii = start; ii <= end; ii++) {
                  if (lines.get(ii).length() < 5) continue;
                  tmp.append(lines.get(ii) + "\n");
              }
              String str = tmp.toString();
              //System.out.println(str);
              if (str.contains("Copyright")   ) continue;
              text.append(str);
              boolstart = boolend = false;
          }
      }
      return text.toString();
  }

或者

public static String Html2Text(String inputString) {
       String htmlStr = inputString; // 含html标签的字符串    
       String textStr = "";
       java.util.regex.Pattern p_script;
       java.util.regex.Matcher m_script;
       java.util.regex.Pattern p_style;
       java.util.regex.Matcher m_style;
       java.util.regex.Pattern p_html;
       java.util.regex.Matcher m_html;
       java.util.regex.Pattern p_html1;
       java.util.regex.Matcher m_html1;
       try {
           String regEx_script = "<[//s]*?script[^>]*?>[//s//S]*?<[//s]*?///[//s]*?script[//s]*?>"; // 定义script的正则表达式{或<script[^>]*?>[//s//S]*?<///script>    
           String regEx_style = "<[//s]*?style[^>]*?>[//s//S]*?<[//s]*?///[//s]*?style[//s]*?>"; // 定义style的正则表达式{或<style[^>]*?>[//s//S]*?<///style>    
           String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式    
           String regEx_html1 = "<[^>]+";
           p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
           m_script = p_script.matcher(htmlStr);
           htmlStr = m_script.replaceAll(""); // 过滤script标签    
           p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
           m_style = p_style.matcher(htmlStr);
           htmlStr = m_style.replaceAll(""); // 过滤style标签    
           p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
           m_html = p_html.matcher(htmlStr);
           htmlStr = m_html.replaceAll(""); // 过滤html标签    
           p_html1 = Pattern.compile(regEx_html1, Pattern.CASE_INSENSITIVE);
           m_html1 = p_html1.matcher(htmlStr);
           htmlStr = m_html1.replaceAll(""); // 过滤html标签    
           textStr = htmlStr;
       } catch (Exception e) {
           System.err.println("Html2Text: " + e.getMessage());
       }
       return textStr;// 返回文本字符串
   }

推荐文档