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中的object转换函数toString()与valueOf()介绍
Dec 31 Javascript
Js实现无刷新删除内容
Apr 29 Javascript
Node.js编写组件的三种实现方式
Feb 25 Javascript
JS中substring与substr的用法
Nov 16 Javascript
基于构造函数的五种继承方法小结
Jul 27 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
Sep 05 Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
Jul 03 jQuery
vue指令做滚动加载和监听等
May 26 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
Jun 18 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
Sep 06 Javascript
javascript实现文字跑马灯效果
Jun 18 Javascript
在vscode 中设置 vue模板内容的方法
Sep 02 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
用 PHP5 轻松解析 XML
2006/12/04 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
使用ltrace工具跟踪PHP库函数调用的方法
2016/04/25 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
jQuery简单实现banner图片切换
2014/01/02 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
jQuery实现移动端手机商城购物车功能
2016/09/24 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
2017/02/18 Javascript
Java与JavaScript中判断两字符串是否相等的区别
2017/03/13 Javascript
JavaScript使用readAsDataURL读取图像文件
2017/05/10 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
React学习之受控组件与数据共享实例分析
2020/01/06 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
在Python中使用mongoengine操作MongoDB教程
2015/04/24 Python
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
Python实战购物车项目的实现参考
2019/02/20 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
护士求职推荐信范文
2013/11/23 职场文书
乡镇庆八一活动方案
2014/02/02 职场文书
青春励志演讲稿范文
2014/08/25 职场文书
单位介绍信格式
2015/01/31 职场文书
天河观后感
2015/06/11 职场文书
go xorm框架的使用
2021/05/22 Golang
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python
Golang数据类型和相互转换
2022/04/12 Golang