截取带HTML标签的文本并保留文本样式
一个截取HTML文本的工具,可以按照文字字数或文字字节长度进行截取,保留HTML样式并在最后自动补齐截取后的标签。
按工作要求编写,时间紧迫,代码未优化,欢迎讨论和指正。
1. [文件] SubHtml.js
/**
* 文件名:SubHtml.js
* 作 者:DHC
* 说 明:带HTML标签根据HTML内容截取指定长度的HTML文本,并自动补齐截取后的标签
* 版 本:1.0
* 时 间:2014-02-24
* 示 例:subHtml($("#div715").html(), 73, false)
*/
(function(o){
/**
* 判断数组中是否包含某个元素
*/
Array.prototype.inArray = function(v){
for(i=0; i < this.length; i++) {
if(this[i] == v){
return true;
}
}
return false;
}
/**
* 将HTML字符串里面的文本字符检出
*/
o.toText = function(oHtml){
if(typeof oHtml === "string"){
return oHtml.replace(/(^\s*)|(\s*$)/g, "").replace(/<[^<^>]*>/g, "").replace(/[\r\n]/g, "");
} else {
return "";
}
};
/**
* 截取带HTML样式的字符串,并保留并自动补齐HTML标签
* oHtml 将要截取的HTML字符串
* nlen 截取后的长度,包含标签之间的空格
* isByte 是否按照字节长度截取
*/
o.subHtml = function(oHtml, nlen, isByte){
var rgx1 = /<[^<^>^\/]+>/; //前标签(<a>的href属性中可能会有“//”符号,先移除再判断)
var rgx2 = /<\/[^<^>^\/]+>/; //后标签
var rgx3 = /<[^<^>^\/]+\/>/; //自标签
var rgx4 = /<[^<^>]+>/; //所有标签
var selfTags = "hr,br,img,input,meta".split(",");
if(typeof oHtml !== "string"){
return "";
}
oHtml = oHtml.replace(/(^\s*)|(\s*$)/g, "").replace(/[\r\n]/g, "");
var oStr = oHtml.replace(/<[^<^>]*>/g, "");
var olen = isByte ? oStr.replace(/[^\x00-\xff]/g,"**").length : oStr.length;
if(!/^\d+$/.test(nlen) || olen <= nlen){
return oHtml;
}
var tStr = oHtml;
var index = 0;
var matchs = new Array();
while(rgx4.test(tStr)){
var m = new Object();
m.index = index + tStr.search(rgx4);
m.string = tStr.match(rgx4).toString();
var len = tStr.search(/<[^<^>]+>/)+tStr.match(/<[^<^>]+>/)[0].length;
tStr = tStr.substr(len);
index += len;
matchs.push(m);
}
if(isByte){
var i=0;
for(var z = 0; z < oStr.length; z++){
i += (oStr.charCodeAt(z) > 255) ? 2 : 1;
if(i >= nlen){
tStr=oStr.slice(0,(z + 1));
break;
}
}
} else {
tStr = oStr.substr(0, nlen);
}
var startTags = new Array();
for(var i = 0; i < matchs.length; i++){
if(tStr.length <= matchs[i].index){
//tStr += matchs[i].string;
matchs = matchs.slice(0, i);
break;http://www.huiyi8.com/dongman/weimei/
} else {唯美动漫图片
tStr = tStr.substring(0, matchs[i].index) + matchs[i].string + tStr.substr(matchs[i].index);
if(rgx1.test(matchs[i].string.replace(/(\/\/)/g, ""))){
var name = matchs[i].string.replace(/[<>]/g, "").split(" ");
if(name.length > 0){
name = name[0];
if(!selfTags.inArray(name)){
startTags.push(name);
}
}
} else if(rgx2.test(matchs[i].string)){
var name = matchs[i].string.replace(/[<\/>]/g, "");
if(startTags.length > 0 && startTags[startTags.length - 1] === name){
startTags.pop();
}
}
}
}
if(startTags.length > 0){
for(var i = startTags.length - 1; i >=0; i--){
tStr += '</' + startTags[i] + '>';
}
}
return tStr;
}
}(window));
最新文章
- ES6 基础知识
- 三种Scriptlet总结
- android开发时使用游标时一定要关闭
- Atititcmd cli环境变量的调用设置与使用
- ios 把已经点击过的UILocalNotification 从系统的通知中心现实中移除
- 使用JdbcTemplate报 Incorrect column count: expected 1, actual 5错误解决
- P4 前端编译器p4c-bm、后端编译器bmv2命令安装 make error问题
- SQL Server2005中使用XML-数据类型、查询与修改
- Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)
- poj1149
- LeetCode OJ 289. Game of Life
- 团队作业8——Beta 阶段冲刺1st day
- 搭建yeoman自动化构建工具
- 《设计模式:可复用面向对象软件的基础》【PDF】下载
- PHP输出打印方法
- zabbix数据库分表的实现
- (8)socketserver并发
- vSphere虚拟化平台升级注意事项
- Spring基于XML方式的使用
- Solution for unable to create ";dead-letter-exchange"; in RabbitMQ