php超长文本安全截取需用mb_substr()指定'utf-8'编码,结合mb_strrpos()智能断行、strip_tags()过滤html、html_entity_decode()与htmlspecialchars()防乱码/xss,并封装为支持多配置的safe_truncate()函数。

PHP中切割超长文本,核心在于按指定长度(如字节数或字符数)安全断行,避免截断中文、UTF-8多字节字符或破坏HTML标签结构。关键不是简单用substr(),而是兼顾编码安全、语义完整和用户体验。
按字节数安全截取(兼容UTF-8)
直接用substr()在UTF-8下极易截断中文导致乱码。应使用mb_substr()并指定编码:
-
必须显式传入
'UTF-8'作为第四个参数,否则默认单字节处理 - 示例:截取前100个Unicode字符(非字节)
$short = mb_substr($text, 0, 100, 'UTF-8'); - 若需按字节限制(如适配数据库字段),先用
mb_strlen($text, 'UTF-8')判断总字符数,再换算——但更推荐按字符截,语义更可靠
智能断行:保留完整词与标点
生硬截到第N个字符可能切在句子中间。可结合空格、标点做“软截断”:
- 先用
mb_substr()取略长的内容(如120字符),再用mb_strrpos()反向查找最近的空格或句号、逗号、感叹号等 - 示例:
$cutLen = 100;<br>$temp = mb_substr($text, 0, $cutLen + 20, 'UTF-8');<br>$pos = mb_strrpos($temp, ' ', 'UTF-8') ?: mb_strrpos($temp, '。', 'UTF-8');<br>$short = $pos ? mb_substr($temp, 0, $pos, 'UTF-8') : mb_substr($text, 0, $cutLen, 'UTF-8');
- 结尾追加
'…'提示截断,增强可读性
过滤并截取含HTML的文本
网页内容常带HTML标签,直接截取会破坏结构或泄露样式。安全做法分三步:
- 先用
strip_tags()剥离标签(可选保留<p><br></p>等基础标签) - 再用
html_entity_decode()转义字符(如→空格),避免截断后出现乱码符号 - 最后用
mb_substr()截取,并用htmlspecialchars()重新转义输出,防止XSS - 若需保留部分格式,可用
DOMDocument解析后遍历文本节点截取,但开销较大,一般场景不必要
封装成可复用函数
把逻辑收拢为一个函数,支持灵活配置:
- 参数包括原文、最大长度、是否省略号、是否清理HTML、自定义断点字符集
- 内部统一用
mb_*函数,强制指定'UTF-8' - 对空字符串、超短文本、全空白等边界情况做提前返回,避免异常
- 示例函数名:
safe_truncate($text, $max = 100, $suffix = '…', $stripHtml = true)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











