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 相关文章推荐
High Performance JavaScript(高性能JavaScript)读书笔记分析
May 05 Javascript
jQuery 拖动层(在可视区域范围内)
May 24 Javascript
页面只能打开一次Cooike如何实现
Dec 04 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
May 15 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
Jun 21 Javascript
前端js实现文件的断点续传 后端PHP文件接收
Oct 14 Javascript
JavaScript中Promise的使用详解
Feb 26 Javascript
基于ES6 Array.of的用法(实例讲解)
Sep 05 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
Mar 01 Javascript
微信小程序自定义组件实现tabs选项卡功能
Jul 14 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
Aug 14 Javascript
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
Nov 09 jQuery
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预定义变量使用帮助(带实例)
2013/10/30 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
php实现分页显示
2015/11/03 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
PHP经典实用正则表达式小结
2017/05/04 PHP
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
EditPlus中的正则表达式 实战(2)
2016/12/15 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
python实现手机通讯录搜索功能
2018/02/22 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
Python实现的北京积分落户数据分析示例
2020/03/27 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
2015暑假实习报告范文
2015/07/13 职场文书
医院感染管理制度
2015/08/05 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
Python中requests做接口测试的方法
2021/05/30 Python
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫