js中根据字数截取字符串,不能截断url


Posted in Javascript onJanuary 12, 2012

今天收到个需求:
1,给一个文字,对输出的文字进行截取,保留400个字符
2,截取内容最后如果是url,保留完整url地址
3,添加省略号......
----
其中对url的保留比较麻烦,尤其是有两个相同url时不能采用indexOf获取其字符位置。
处理结果:

js中根据字数截取字符串,不能截断url

相关代码:
String.prototype.sizeAt = function(){ 
var nLen = 0; 
for(var i = 0, end = this.length; i<end; i++){ 
nLen += this.charCodeAt(i)>128?2:1; 
} 
return nLen; 
}; 
String.prototype.cutStr = function(n, sCut){ 
if(this.sizeAt() <= n){ 
return this; 
} 
sCut = sCut || ""; 
var max = n-sCut.sizeAt(); 
var nLen = 0; 
var s = this; 
for(var i =0,end = this.length;i<end;i++){ 
nLen += this.charCodeAt(i)>128?2:1; 
if(nLen>max){ 
s = this.slice(0,i); 
s += sCut; 
break; 
} 
} 
return s.toString(); 
}; 
String.prototype.cutStrButUrl = function(n, sCut){ 
if(this.sizeAt() <=n){ 
return this.toString(); 
} 
sCut = sCut || ""; 
var max = n-sCut.sizeAt(); 
var s = this; 
//查找所有包含的url 
var aUrl = s.match(/https?:\/\/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-_A-Z0-9a-z\$\.\+\!\*\/,:;@&=\?\~\#\%]*)*/gi); 
//当第max个字符刚好在url之间时,bCut会被设置为flase; 
var bCut = true; 
if(aUrl){ 
//对每个url进行判断 
for(var i=0, endI = aUrl.length;i<endI;i++){ 
var sUrl = aUrl[i]; 
//可能出现两个相同url的情况 
var aP = s.split(sUrl); 
var nCurr = 0; 
var nLenURL = sUrl.sizeAt(); 
var sResult = ""; 
for(j = 0, endJ = aP.length; j<endJ; j++){ 
nCurr +=aP[j].sizeAt(); 
sResult +=aP[j]; 
sResult += sUrl; 
//当前字数相加少于max但添加url超过max:即会截到url 
if(nCurr < max && nCurr + nLenURL>max){ 
s = sResult + sCut; 
bCut = false; 
break; 
} 
nCurr += nLenURL; 
} 
if(bCut === false){ 
break; 
} 
}; 
} 
if(bCut){ 
s = s.cutStr(n, sCut); 
} 
return s.toString(); 
}; 
console.log('正常截取20个字符'.cutStrButUrl(20,'......')); 
console.log('正常截取20个字符,但我超了'.cutStrButUrl(20,'......')); 
console.log('有url的字符串http://www.baidu.com你能截取到吗?'.cutStrButUrl(20,'......')); 
console.log('http://www.baidu.com有两个相同url的字符串http://www.baidu.com好吗?'.cutStrButUrl(51, '......'));
Javascript 相关文章推荐
jquery ajax提交整个表单元素的快捷办法
Mar 27 Javascript
jquery ajax 调用失败的原因示例介绍
Sep 27 Javascript
JQuery中form验证出错信息的查看方法
Oct 08 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
Jul 02 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
Aug 01 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
Jun 08 Javascript
jQuery移动web开发中的页面初始化与加载事件
Dec 03 Javascript
AngularJS自定义插件实现网站用户引导功能示例
Nov 07 Javascript
原生javascript实现读写CSS样式的方法详解
Feb 20 Javascript
详解angularJS自定义指令间的相互交互
Jul 05 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 Javascript
js实现随机点名功能
Dec 23 Javascript
js 实现css风格选择器(压缩后2KB)
Jan 12 #Javascript
js日历功能对象
Jan 12 #Javascript
关于 文本框默认值 的操作js代码
Jan 12 #Javascript
新发现一个骗链接的方法(js读取cookies)
Jan 11 #Javascript
JS读取cookies信息(记录用户名)
Jan 10 #Javascript
判断对象是否Window的实现代码
Jan 10 #Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
Jan 10 #Javascript
You might like
PHP学习之字符串比较和查找
2011/04/17 PHP
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
给Function做的OOP扩展
2009/05/07 Javascript
精心挑选的12款优秀的基于jQuery的手风琴效果插件和教程
2012/08/22 Javascript
js 获取计算后的样式写法及注意事项
2013/02/25 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
JS继承用法实例分析
2015/02/05 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
js 原型对象和原型链理解
2017/02/09 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
js验证账户名是否重复
2020/05/26 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
Python下的subprocess模块的入门指引
2015/04/16 Python
python使用mailbox打印电子邮件的方法
2015/04/30 Python
python使用生成器实现可迭代对象
2018/03/20 Python
python绘制圆柱体的方法
2018/07/02 Python
python修改txt文件中的某一项方法
2018/12/29 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
年度评优评先方案
2014/06/03 职场文书
银行进社区活动总结
2014/07/07 职场文书
工作经历证明书范文
2014/11/02 职场文书
2015年教育实习工作总结
2015/04/24 职场文书
社区安置帮教工作总结2015
2015/05/20 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python