推荐使用 mb_strcut() 截取字符串并加省略号,因其按字节截断且不破坏多字节字符;mb_substr() 按字符数截可能产生乱码,而 mb_strcut() 自动识别 UTF-8 边界,更安全稳定。

PHP 中截取指定长度字符串并添加省略号,推荐使用 mb_strcut()(而非 mb_substr()),因为它按字节截断、不破坏多字节字符(如中文),更安全稳定。
为什么用 mb_strcut 而不是 mb_substr?
mb_substr() 按字符数截取,遇到某些 UTF-8 边界可能截出乱码;mb_strcut() 按字节长度截,内部自动识别字符边界,保证截出来的仍是合法的多字节字符串。
基础用法:截取 + 加省略号
核心逻辑:先用 mb_strcut() 截取,再判断是否需要加省略号:
- 若原文字节数 ≤ 指定长度,直接返回原文
- 若超过,截取前
$length - 3字节(预留 3 字节给 '...'),再拼接 - 注意:'...' 是 3 个 ASCII 字符,占 3 字节,不会影响 UTF-8 中文解析
示例代码:
立即学习“PHP免费学习笔记(深入)”;
function mb_strcut_ellipsis($str, $length, $encoding = 'UTF-8') {
if (mb_strlen($str, $encoding) <= $length) {
return $str;
}
// mb_strcut 按字节截,$length - 3 确保有空间放 ...
$cut = mb_strcut($str, 0, $length - 3, $encoding);
return $cut . '...';
}
<p>// 使用
echo mb_strcut_ellipsis('你好世界,欢迎来到 PHP 编程', 12);
// 输出:你好世界,欢...</p>注意事项与避坑点
-
长度单位是字节,不是字符:中文在 UTF-8 下通常占 3 字节,所以
$length = 12最多容纳约 4 个汉字 + 省略号 - 编码必须显式传入(如
'UTF-8'),否则可能因默认编码不一致导致截断异常 - 如果字符串本身含 HTML 标签或特殊符号,需先过滤或 strip_tags,否则省略号可能插在标签中间造成渲染问题
- 想支持英文单词不断开?
mb_strcut不支持智能断词,可改用正则 +mb_substr配合空格回退,但复杂度上升
兼容性补充(PHP 7.4+ 更简单)
PHP 7.4 起支持 mb_strimwidth(),一行搞定截取+省略:
// 自动在末尾加 '...',第三个参数是截取宽度(字节),第四个是省略符
echo mb_strimwidth('Hello 世界 abc', 0, 10, '...', 'UTF-8');
// 输出:Hello 世...不过它底层仍调用 mb_strcut,行为一致,只是封装更简洁。



















