网站首页 文章专栏 字符串截取--尽可能按照中文长度截取
截取字符串指定长度的常规方法: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...
如上:运行结果基本理想。
转载请注明出处