关于中英文混合字符串截取功能

有时候,我们经常会遇到这样的需求,提示层文字超出,需要JS做字符串截取,但是呢,我们常常会烦恼文字中英文混合如何判断,因为我们知道在JS中 string.length这个值是不考虑中英文的,但是计算机对中英文的识别是 中文占2个字符,英文一个字母占一个字符(包括数字)。查阅相关资料后,最近找到一个好的办法解决此问题。
分析下逻辑,比如我们要对字符串截取10个字(英文就是20个字符),创建一个函数

   function SetSub(str,n){
       //主体代码
   }

参数n表示我们要截取的字符,参数str表示我们要处理的字符串,这里设定n为10;首先,定义个正则 变量

   var strReg=/[^\x00-\xff]/g;

其实这个正则并不陌生,它是判断是否为中文的正则,早在 我以前的 文章 JQ 输入框字数提示插件中就有提到过。

第二步,我们把需要的处理的字符串处理成单字符的文字

   var _str=str.replace(strReg,"**");
//我们将字符串中中文替换成"**"
   var _len=_str.length;
//计算出整个字符串的长度,这个其实很重要
//如果长度_len<=n,我们便不处理,直接返回str,如果大于,那么进入下一步

关键的一步来了,我们要先计算 n/2的值,为什么要这个值呢,先看下面的代码

   var _str=str.replace(strReg,"**");
   var _len=_str.length;
   if(_len>n){
     var _newLen=Math.floor(n/2);
     var _strLen=str.length;
     for(var i=_newLen;i<_strLen;i++){
         var _newStr=str.substr(0,i).replace(strReg,"**");
         if(_newStr.length>=n){
            return str.substr(0,i)+"...";
             break;
        }
     }
   }else{
     return str;
   }

这里为什么是n/2呢,因为前面提到中文和英文的差别是2个字符和1个字符的差别,由于下面需要进行for的循环,考虑到中文,我们将进行极端假设法,全部中文,于是将 for循环的i初始值设定为中文的最小长度(即n/2),由于考虑到单数,于是加上Math.floor(n/2)取最小整数值。
通过for对传入的字符串依次遍历,并转化成英文,计算其长度,如果大于 n, 便终止循环并跳出。完整代码如下:

function SetSub(str,n){
   var strReg=/[^\x00-\xff]/g;
   var _str=str.replace(strReg,"**");
   var _len=_str.length;
   if(_len>n){
     var _newLen=Math.floor(n/2);
     var _strLen=str.length;
     for(var i=_newLen;i<_strLen;i++){
         var _newStr=str.substr(0,i).replace(strReg,"**");
         if(_newStr.length>=n){
             return str.substr(0,i)+"...";
             break;
        }
     }
   }else{
     return str;
   }
}
 SetSub("中文english",5) //中文e...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值