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 相关文章推荐
js cookies实现简单统计访问次数
Nov 24 Javascript
理解Javascript_11_constructor实现原理
Oct 18 Javascript
JS格式化数字金额用逗号隔开保留两位小数
Oct 18 Javascript
JS实现漂亮的时间选择框效果
Aug 20 Javascript
jQuery实现简单的抽奖游戏
May 05 jQuery
vue过渡和animate.css结合使用详解
Jun 14 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
Jul 06 Javascript
页面内锚点定位及跳转方法总结(推荐)
Apr 24 Javascript
通过实例学习React中事件节流防抖
Jun 17 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
Jun 05 Javascript
JavaScript文档加载模式以及元素获取
Jul 28 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
Aug 24 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
ajax缓存问题解决途径
2006/12/06 PHP
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
JS设计模式之命令模式概念与用法分析
2018/02/06 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
Python实现全角半角转换的方法
2014/08/18 Python
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
简单分析Python中用fork()函数生成的子进程
2015/05/04 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
Django Form常用功能及代码示例
2020/10/13 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
顶碗少年教学反思
2014/02/21 职场文书
会计员岗位职责
2014/03/15 职场文书
委托书样本
2014/04/02 职场文书
《高尔基和他的儿子》教学反思
2014/04/09 职场文书
打架检讨书范文
2015/01/27 职场文书
撤诉申请怎么写
2015/05/19 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript
Oracle 区块链表创建过程详解
2021/05/15 Oracle
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL