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 相关文章推荐
javascript 仿QQ滑动菜单效果代码
Sep 03 Javascript
javascript代码编写需要注意的7个小细节小结
Sep 21 Javascript
通过jQuery源码学习javascript(一)
Dec 27 Javascript
javascript中比较字符串是否相等的方法
Jul 23 Javascript
jquery三个关闭弹出层的小示例
Nov 05 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
Dec 24 Javascript
jQuery  ready方法实现原理详解
Oct 19 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
Dec 27 Javascript
react-native ListView下拉刷新上拉加载实现代码
Aug 03 Javascript
深入浅析JS中的严格模式
Jun 04 Javascript
JavaScript实现异步图像上传功能
Jul 12 Javascript
小程序实现上下移动切换位置
Sep 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
实测在class的function中include的文件中非php的global全局环境
2013/07/15 PHP
PHP积分兑换接口实例
2015/02/09 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
js获取url传值的方法
2015/12/18 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
纯js代码制作的网页时钟特效【附实例】
2016/03/30 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
js简易版购物车功能
2017/06/17 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
利用Python破解验证码实例详解
2016/12/08 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
python监控键盘输入实例代码
2018/02/09 Python
python re模块的高级用法详解
2018/06/06 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
tensorflow之并行读入数据详解
2020/02/05 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
初中生自我鉴定
2014/02/04 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
大学生暑期实践感言
2014/02/26 职场文书
明星员工获奖感言
2014/08/14 职场文书
庐山导游词
2015/02/03 职场文书
mysql insert 存在即不插入语法说明
2022/03/25 MySQL
Java实现简单小画板
2022/06/10 Java/Android
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技