数据库中存储有一段带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("", " "); rs = rs.replaceAll("<", "<"); rs = rs.replaceAll(">", ">"); 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; } }
本篇文章来源于:开发学院 http://edu.codepub.com 原文链接:http://edu.codepub.com/2009/0929/15916.php