记一次js中和php中的字符串长度计算截取的终极问题和完美解决方案

1.js是用unicode算长度的,比如单字节的算1,中文也算1,但是正常我们想让两个单字节算1,如何计算这个长度


第一种解决方案,用正则,如下 /[\u0x00-\u0xff]/,天真的想着,这样就可以匹配所有unicode在这个之间的了,但是,这个正则不匹配标点符号,比如空格,逗号,不知道为什么,所以,只能去遍历charCodeAt了 代码如下:

 

function getStringWidth(s){

		var length = 0;

		for(var i=0;i<s.length;i++) {

			if(s.charCodeAt(i)>255) {

				length++;

			} else {

				length += 0.5;

			}

		}

		return Math.ceil(length);

	}


 


2.php的长度要分编码的,我只说utf8,写php还gbk的,我就不说什么了

如何计算长度呢?

正则?[x00-xff]这玩意不匹配空格逗号,不能像js那样用ord来算,因为ord只计算一个字节

这儿有个极品的办法,我用mb_substr从字符串的尾部每次截一个,然后判断截完之后和截之前的长度差,如果差1那么长度就+0.5,大于1那么长度就+1,最终取个ceil,完美解决,代码如下:

 

function get_string_width($s) {

        $length = 0;

        while(strlen($s)>0) {

            $old_length = strlen($s);

            $s = mb_substr($s, 0,-1,'utf8');

            if(($old_length-strlen($s))==1) {

                $length += 0.5;

            } else {

                $length += 1;

            }

        }

        return ceil($length);

    }

测试完毕,符合要求


3。截取

 

function cut_string($s,$l=140) {

        $length = get_string_width($s);

        if($length>$l) {

            while(get_string_width($s.'...')<=$l) {

                $s = mb_substr($s, 0,-1,'utf8');

            }

            $s .= '...'; 

        }

        return $s;

    }


 

 

 

你可能感兴趣的:(解决方案)