关于截取带html标签的文字的前n个字符的处理(需求一)

来源:互联网 发布:java 备忘录 编辑:程序博客网 时间:2024/04/28 01:30

需求:

数据库中存储有一段带html标签的文字,如:

<P>《Windows》系统是越用越慢,这是不争的事实。</P> <P>因此,使用Win<font size='12pt'>d</font>ows就免不<img src='http:/www.blueidea.com/img/common/logo.gif'/>了要重新安装系统。<br>当然<span style='border:solid 1px red;font-size:23px'>,重新安装系</span>统并不难,但是安装完系统后你知道我<h1>们</h1>有多少事情必须要做吗?<br><strong>这</strong>可容不得丝毫的松懈,一旦马虎,将可能会导致前功尽弃,甚至有可能会造成数据丢失、信息泄密!</P>

现在要把它的前n个实际意义(即不包括html标签)的字符取出来,而且不能破坏它的段落标记,也就是说该是几段还是几段,p标签不算做n个字之内,又不能去掉

常见处:

新闻、小说、博客等的首页列表

代码:

 

import java.util.regex.Matcher;
import java.util.regex.Pattern;

 

public class HtmlTagRemove {
 /**
  * @function  出入口函数,获取文章的导读(前段文字)
  * @param str 文章字符串
  * @param length 导读长度
  * @return 文章导读
  */
 public String getNevigation(String str,int length){
  
  //去掉除p以外的其他html标签
  str = removeHtmlTagExceptP(str);
  
  //获取导读
  str = getHeadSubStr(str, length);
  
  //补充导读中的P标签
  str = repairPTag(str);
  
  return str;
 }

 /**
  * 函数说明:去掉p以外的其他标签
  * @param 带html标签的字符串
  * @return 处理后的字符串
  */
 public String   removeHtmlTagExceptP(String   htmlstr)   {
  //正则说明:/s 空白字符,  . 任何字符, * 零次或多次, ? 一次或一次也没有 ,*? 零次或多次  ,^ 除   之外
  
        //Pattern   pat   =   Pattern.compile("//s*<[^p].*?[^p]>//s*", Pattern.DOTALL |   Pattern.MULTILINE   | Pattern.CASE_INSENSITIVE);
  Pattern   pat   =   Pattern.compile("//s*</?+[^p].*?>//s*", Pattern.DOTALL |   Pattern.MULTILINE   | Pattern.CASE_INSENSITIVE);
       
        ////s?[s|Sc|Cr|Ri|Ip|Pt|T]  
        Matcher   m   =   pat.matcher(htmlstr);  
        //去掉所有html标记  
        String   rs   =   m.replaceAll("");  
        rs   =   rs.replaceAll("&nbsp",   " ");  
        rs   =   rs.replaceAll("&lt;",   "<");  
        rs   =   rs.replaceAll("&gt;",   ">");  
        return   rs;  
    } 
 /**
  * 函数说明:获取字符串的前一段文字
  * @param str 目标字符串
  * @param subLen 获取文字的长度
  * @return 得到的字符串
  */
 public String  getHeadSubStr(String str,int subLen){
  StringBuffer strBuffer =new StringBuffer();
  int count=0;
  for(int i=0;str!=null&&i<str.length();){
   char c = str.charAt(i);   
   if(c=='<'&&str.charAt(i+1)=='p'&&str.charAt(i+2)=='>'){
    
    
      strBuffer.append(c);
      strBuffer.append(str.charAt(i+1));
      strBuffer.append(str.charAt(i+2));
      i+=3;
      continue;
   }     
   if(c=='<'&&str.charAt(i+1)=='/'&&str.charAt(i+2)=='p'&&str.charAt(i+3)=='>'){
     
       strBuffer.append(c);
       strBuffer.append(str.charAt(i+1));
       strBuffer.append(str.charAt(i+2));
       strBuffer.append(str.charAt(i+3));
       i+=4;
       continue;      
   }
   strBuffer.append(c);
   i++;
   if(++count==subLen){
    break;
   }
  }
  return strBuffer.toString();
 }
 /**
  * 方法说明:修补获取的字符串(主要是匹配p标签)
  * @param str 目标字符串
  * @return 修补后的字符串
  */
 public String repairPTag(String str){
  
  //判断截取的字符串p标签是否完整
  String lastSubStr = str.substring(str.length()-3);
  if(!lastSubStr.equals("</p>")){
   str = str+"</p>";
  }
  return str;
 }
}

原创粉丝点击