substr 的基本用法
substr(string $string, int $offset, ?int $length = null): string 用于从字符串中截取一段。$offset 是起始位置,从 0 开始计数;$length 为可选长度,省略时截取到字符串末尾。
echo substr(“hello world”, 6); // world
echo substr(“hello world”, 0, 5); // hello
第三个参数传 0 会返回空字符串,而不是剩余部分,这一点常被误用。
负数偏移与负数长度
$offset 为负数时,从字符串末尾倒数开始。$length 为负数时,表示从末尾去掉多少个字符。
echo substr(“hello world”, -5); // world
echo substr(“hello world”, 0, -6); // hello
echo substr(“hello world”, -5, 3); // wor
负数组合适合去掉固定后缀、取文件名扩展名之前的名称等场景,比正则更轻量。
返回值与边界情况
当 $offset 超出字符串长度时,PHP 8 起返回空字符串,早期版本返回 false。截取结果为空也会返回空字符串。因此做严格判断时,建议先用 strlen 校验长度,或统一按字符串处理,避免混淆 false 与 ""。
另外,$offset 等于字符串长度时返回空字符串,不是错误。
中文与多字节字符的坑
substr 按字节截取,对 UTF-8 编码的中文,一个汉字通常占 3 个字节,直接截取很容易出现乱码或半个字符。
$str = “你好世界”;
echo substr($str, 0, 3); // 可能输出乱码
处理中文、emoji 等多字节内容,应改用 mbsubstr($str, $start, $length, 'UTF-8')。mbsubstr 的参数语义与 substr 一致,支持负数,但按字符而非字节计数。使用前需确认 mbstring 扩展已启用。
实用建议
需要按字节处理二进制数据、ASCII 文本时用 substr;涉及用户输入、中文文案、URL 参数时优先用 mb_substr。截取前明确编码,固定传 'UTF-8',可减少环境差异带来的问题。对性能敏感的大循环,substr 比正则更快,但可读性上仍应优先保证意图清晰。