• 用JS来实现于截取中英文混合字符串方法(转载)


    网站制作过程中,提示层文字超出,需要JS做字符串截取,但是呢,我们常常会烦恼文字中英文混合如何判断,因为我们知道在JS中 string.length这个值是不考虑中英文的,但是计算机对中英文的识别是 中文占2个字符,英文一个字母占一个字符(包括数字)。查阅相关资料后,最近找到一个好的办法解决此问题。

    分析下逻辑,比如我们要对字符串截取10个字(英文就是20个字符),创建一个函数

    view plaincopy to clipboardprint?

    function SetSub(str,n){  

        //主体代码  

    }  

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

    view plaincopy to clipboardprint?

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

    其实这个正则并不陌生,它是判断是否为中文的正则

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

    view plaincopy to clipboardprint?

       var _str=str.replace(strReg,"**");  

    //我们将字符串中中文替换成"**"  

       var _len=_str.length;  

    //计算出整个字符串的长度,这个其实很重要  

    //如果长度_len<=n,我们便不处理,直接返回str,如果大于,那么进入下一步  

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

    view plaincopy to clipboardprint?

    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, 便终止循环并跳出。完整代码如下:

    view plaincopy to clipboardprint?

    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...  

    以上方法,经测试可行。

  • 相关阅读:
    集合框架
    hashtable
    测试3
    opcache的威力
    信息的信息
    php blog to explore
    BEHAT安装
    Failed to start: SocketListener0@0.0.0.0:4444
    模板方法设计模式
    mysqldump
  • 原文地址:https://www.cnblogs.com/lilefordream/p/3332992.html
Copyright © 2020-2023  润新知