今天收到个需求:
1,给一个文字,对输出的文字进行截取,保留400个字符
2,截取内容最后如果是url,保留完整url地址
3,添加省略号......
----
其中对url的保留比较麻烦,尤其是有两个相同url时不能采用indexof获取其字符位置。
处理结果:
相关代码:
复制代码 代码如下:
string.prototype.sizeat = function(){
var nlen = 0;
for(var i = 0, end = this.length; inlen += this.charcodeat(i)>128?2:1;
}
return nlen;
};
string.prototype.cutstr = function(n, scut){
if(this.sizeat() return this;
}
scut = scut || ;
var max = n-scut.sizeat();
var nlen = 0;
var s = this;
for(var i =0,end = this.length;inlen += 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() 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;ivar surl = aurl[i];
//可能出现两个相同url的情况
var ap = s.split(surl);
var ncurr = 0;
var nlenurl = surl.sizeat();
var sresult = ;
for(j = 0, endj = ap.length; jncurr +=ap[j].sizeat();
sresult +=ap[j];
sresult += surl;
//当前字数相加少于max但添加url超过max:即会截到url
if(ncurr 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, '......'));