推荐使用 mb_substr + mb_strlen 组合实现 UTF-8 安全截断:当文本长度超过指定值时,按字符截取并添加省略号,避免乱码与显示偏差。

直接可用的截断+省略号函数
PHP 7.4 默认启用 mbstring 扩展,推荐用 mb_substr + mb_strlen 组合实现安全截断。下面这个函数简洁、可靠,不依赖额外判断,适用于 UTF-8 编码的中文、英文混合文本:
// 放入 function.php 或公共函数文件中
function subtext($text, $length) {
if (mb_strlen($text, 'UTF-8') > $length) {
return mb_substr($text, 0, $length, 'UTF-8') . '…';
}
return $text;
}
调用示例:echo subtext('人工智能正在改变世界', 6); // 输出:人工智能…echo subtext('Hello', 10); // 输出:Hello(不加省略号)
为什么不用 mb_strimwidth?
虽然 mb_strimwidth($str, 0, $len, '…', 'UTF-8') 看似一步到位,但它有隐含风险:
- 第三个参数是“显示宽度”,不是字符数——在等宽字体下才准确,网页渲染中常因字体、CSS 导致实际视觉长度偏差
- 当字符串含全角标点或 emoji 时,
mb_strimwidth可能提前截断或漏掉省略号 - PHP 7.4 中该函数对空格和换行处理不够稳定,偶发多出空格或截断异常
注意编码与边界安全
确保三处统一使用 'UTF-8'(显式传参,不依赖内部编码设置):
-
mb_strlen($text, 'UTF-8')—— 准确计数中文/emoji/字母均为 1 个字符 -
mb_substr($text, 0, $length, 'UTF-8')—— 按字符切,不会把一个中文拆成乱码字节 - 模板或输出前确认 HTML 响应头为
Content-Type: text/html; charset=UTF-8
进阶:支持自定义省略符与起始偏移
如需更灵活控制(比如从第 2 个字符开始截、用「...」代替「…」),可扩展为:
function subtext($text, $length, $suffix = '…', $start = 0) {
$fullLen = mb_strlen($text, 'UTF-8');
if ($fullLen
$available = $fullLen - $start;
if ($available
return mb_substr($text, $start, $length, 'UTF-8') . $suffix;
}
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











