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 建设银行登陆键盘
Jun 10 Javascript
JavaScript实现动态增加文件域表单
Feb 12 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
Apr 27 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
Aug 08 Javascript
jQuery实现延迟跳转的方法
Jun 05 Javascript
JQuery实现图片轮播效果
Sep 15 Javascript
EasyUI创建对话框的两种方式
Aug 23 Javascript
深究AngularJS中ng-drag、ng-drop的用法
Jun 12 Javascript
解决vue的 v-for 循环中图片加载路径问题
Sep 03 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
Jul 16 Javascript
vue项目中使用bpmn为节点添加颜色的方法
Apr 30 Javascript
处理JavaScript值为undefined的7个小技巧
Jul 28 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
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
一组PHP加密解密函数分享
2014/06/05 PHP
php实现TCP端口检测的方法
2015/04/01 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
微信小程序获取手机号授权用户登录功能
2017/11/09 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
微信小程序实现传递多个参数与事件处理
2019/08/12 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
在Django中限制已登录用户的访问的方法
2015/07/23 Python
Python实现基本线性数据结构
2016/08/22 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
能源工程专业应届生求职信
2014/03/01 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
工资证明格式模板
2015/06/12 职场文书
《秋天的雨》教学反思
2016/02/19 职场文书
Oracle笔记
2021/04/05 Oracle
Python OpenCV快速入门教程
2021/04/17 Python
详解Flask开发技巧之异常处理
2021/06/15 Python