php截取并补齐字符串需协同截断与填充:优先用mb_substr防中文乱码,再用str_pad补齐;sprintf适合固定宽格式化;智能省略需预留3字符给“…”。

PHP 中截取字符串并自动补齐字符,是表单处理、日志对齐、导出报表等场景里的常见需求。核心不在于“截”或“补”单独操作,而在于两步协同:先按需截断,再按规则填充,且要兼顾中文、英文、字节长度等实际差异。
用 substr() 截取 + str_pad() 补齐最常用
这是初学者最易掌握、项目中最稳妥的组合方式:
- substr() 负责精准截取:支持负数起始位置(从末尾算),可指定长度;注意它按字节截,中文可能被截断(UTF-8 下一个汉字占 3 字节)
- str_pad() 负责补齐:可指定填充字符(如空格、0、*)、方向(左/右/两端)、总长度;默认用空格,右对齐
- 示例:把用户名截成最多 8 个字符,不足则右侧补点号
php
$username = "张三丰";
$truncated = substr($username, 0, 8); // 先截
$padded = str_pad($truncated, 8, ".", STR_PAD_RIGHT); // 再补
echo $padded; // 输出:"张三丰....."
?>
处理中文时优先用 mb_substr() 防乱码
直接用 substr() 处理 UTF-8 中文容易切在中间,导致乱码。必须改用多字节安全函数:
- mb_substr($str, $start, $length, 'UTF-8'):按字符数而非字节数截取,中文、英文都算 1 个单位
- 搭配 mb_strlen($str, 'UTF-8') 获取真实字符长度,避免 strlen() 返回错误字节数
- str_pad() 本身不支持多字节,但只要输入是完整字符(由 mb_substr 保证),它就能正确填充
- 示例:统一显示为 6 个汉字宽,不足补全角空格(U+3000)
$name = "小明";
$chinese_padded = mb_substr($name, 0, 6, 'UTF-8');
$chinese_padded = str_pad($chinese_padded, 6, " ", STR_PAD_RIGHT); // 全角空格
echo $chinese_padded; // 输出:"小明 "
?>
需要动态对齐?用 sprintf() 一行搞定
当目标是固定宽度文本输出(如日志、CLI 工具),sprintf 的格式化能力更简洁:
- sprintf("%-10s", $str):左对齐,总宽 10,不足补空格
- sprintf("%08d", $num):数字补零到 8 位(适合订单号、编号)
- 注意:sprintf 默认按字节对齐,中文仍需先用 mb_substr 截好再传入,否则宽度计算不准
- 示例:生成带前缀的 12 位编号
$id = "123";
$code = sprintf("NO%09d", $id); // NO 后补 9 位数字
echo $code; // 输出:"NO000000123"
?>
进阶:截取后智能省略(…)并保持长度稳定
前端展示常需“过长则截 + 加省略号”,但直接截会破坏总长度。可靠做法是预留空间给省略符:
- 设定最大显示宽度为 N,则实际截取长度应为 N−3(留 3 位给"…")
- 先用 mb_strlen 判断是否超长;超长才截,再拼接"…";不超长则原样返回
- 确保最终字符串总字符数恒为 N(含省略号),方便表格列对齐
- 示例:
function truncateWithEllipsis($str, $maxLen = 10) {
$len = mb_strlen($str, 'UTF-8');
if ($len return mb_substr($str, 0, $maxLen - 3, 'UTF-8') . '…';
}
echo truncateWithEllipsis("这是一段很长的标题文字", 10); // 输出:"这是一段很…"
?>
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











