网站首页 文章专栏 字符串截取--尽可能按照中文长度截取

字符串截取--尽可能按照中文长度截取

编辑时间:2020-07-11 10:16:44 作者:苹果 浏览量:2217


    前言:给前端返回列表接口,不想传输太多的字节流,就将每个描述字段返回了100个字,但前端拿到的确实长短不一,甚至纯中文的长度和夹杂英文的长度,差距过大,该如何能保证自己截取的字符串长度尽可能均衡呢?


截取字符串指定长度的常规方法:mb_substr


eg:

    $str_array     = [
        '你若安好,便是晴天!你若不好,我就遭殃...',
        '隐约雷鸣 阴霾天空 但盼风雨来',
        'Rick和Morty是由 Justin Roiland和 Dan Harmon为卡通网络深夜节目!',
        'bydls123409091211313314',
    ];
    
    foreach ($str_array as $str){
        echo  mb_substr($str,0,12,'UTF-8').'...<br>';    //与 substr()用法相同,从第0 字符位计数,截取12个字符
    }

运行得到的返回结果为:

    你若安好,便是晴天!你若...    
    隐约雷鸣 阴霾天空 但盼...
    Rick和Morty是由...
    In January 2...


如上:纯中文的还算理想,但是中英文混合的情况,长度差距真的有点大,毕竟,这次截取了12个字符!


查阅手册,找到了一个相对好的方法:mb_strimwidth   用法详见官网 :https://www.php.net/manual/zh/function.mb-strimwidth.php

eg:

    foreach ($str_array as $str){
       echo  mb_strimwidth($str,0,24,'...','UTF-8').'<br>';//
    }

运行得到的返回结果为:

    你若安好,便是晴天!你...
    隐约雷鸣 阴霾天空 但...
    Rick和Morty是由 Justi...
    In January 2014, the ...

如上:运行结果基本理想,但是传入的参数为需要截取的长度12的倍数24,并且截取到的字符只有11个。


在这个函数基础上进行改进,封装一个函数:

         /**
         * @param string $value
         * @param int $limit
         * @param string $end
         * @return string
         * @author: hbh
         * @Time: 2020/7/11   10:11
         */
         function limit(string $value, int $limit = 100, string $end = '...'): string
        {
            $limit*=2;
            if (mb_strwidth($value, 'UTF-8') <= $limit) {
                return $value;
            }
        
            return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')).$end;
        }


调用上面的方法处理:

    foreach ($str_array as $str){
        echo  limit($str,12).'<br>';
    }

运行得到的返回结果为:

    你若安好,便是晴天!你若不...    
    隐约雷鸣 阴霾天空 但盼风...
    Rick和Morty是由 Justin R...
    In January 2014, the ser...

如上:运行结果基本理想。



    出自:何冰华个人网站

    地址:https://www.hebinghua.com/

    转载请注明出处


来说两句吧
最新评论