wordwrap() 不适用于纯中文换行,因其依赖空格断词;纯中文需用 mb_substr() 按字符切分并手动处理,避免 utf-8 截断。

PHP 中 wordwrap() 是最直接的智能换行方案
它专为“按宽度断行但不断词”设计,底层逻辑就是:在每 $width 字符附近向左找空格,找不到就按需截断(取决于 $cut_long_words 参数)。不用自己写循环、不操心 UTF-8 多字节问题,PHP 内置已处理。
常见错误现象:wordwrap($text, 30) 在中文里看起来“没效果”或“乱断”,其实是默认用空格分隔——而中文句子通常无空格。这不是函数失效,是输入文本特征不匹配。
- 英文/中英混排:直接用,效果可靠
- 纯中文(无空格):需先预处理(如按字切分+插入空格),或改用自定义逻辑
-
$break参数别传空字符串,会触发警告;HTML 场景建议用"<br>"
,终端日志用"\n" -
$cut_long_words = false(默认)时,超长单词(如 URL、一串无空格拼音)会整行溢出,不换行
纯中文文本怎么安全换行?别硬套 wordwrap()
中文没有天然单词边界,wordwrap() 的“空格优先”策略在此失效。强行用会导致整段不换行,或只在标点处断(如果恰好有空格或全角空格)。
正确做法是按字符数(非字节数)切分,同时避免在 UTF-8 编码中间截断。推荐用 mb_substr() + 手动扫描:
示例逻辑片段:
function chineseWrap($text, $width) {
$result = '';
$pos = 0;
while ($pos
- 必须用
mb_*系列函数,否则中文会乱码或截断失败 - 不判断标点/语义,仅保长度可控;若需更智能(如避开句号后换行),得加正则回溯
- 性能上比
wordwrap()略低,但对纯中文是必要代价
nl2br() 和换行符不是换行算法,只是转义工具
nl2br() 不做任何截断或宽度控制,它只干一件事:把字符串里的 "\n" 替换成
"<br>"。如果你的文本里本来就没有换行符,调它等于白调。
典型误用场景:
- 想让一段 200 字的摘要“自动适应卡片宽度”,却只加
nl2br()→ 页面上还是一整行 - 和
wordwrap()混用顺序错:nl2br(wordwrap($text, 40))正确;wordwrap(nl2br($text), 40)会把"<br>"
当普通字符计长,导致错位 - CLI 脚本里用
nl2br()→ 输出一堆可见的"<br>"
字符,因为终端不解析 HTML
文生图场景下文字截断要防“半字渲染”和布局溢出
生成图片时(比如用 GD 或 Imagick 写文字),前端换行逻辑无效,必须在 PHP 层完成分段。此时重点不是“美观换行”,而是“确保每行像素宽度 ≤ 图片可用区域”。
关键点:
- 别只信字符数:中文字宽≈英文字宽的两倍,10 个汉字 ≈ 20 个 ASCII 字符像素宽度
- 用
imagettfbbox()或imageftbbox()实测每行真实宽度,再动态调整分段位置 - 避免在行首/行尾留半个标点(如“,”、“。”被切到下一行开头),可用正则微调:
preg_replace('/([,。!?;:])$/', '$1 ', $line) - 兜底强制截断必须存在——否则单个超长 URL 或 base64 片段可能撑爆画布
真正容易被忽略的是字体度量差异:同一字号下,思源黑体和微软雅黑的汉字宽度不同,服务端没加载对应字体时,imagettfbbox() 返回值会偏差。上线前务必在目标环境实测。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











