PHP 7.4 中 mb_substr() 支持负数 offset,从字符串末尾按 Unicode 字符计数截取,需指定正确 encoding(如 UTF-8),不支持负 length,可用 mb_right 等封装函数简化操作。

PHP 7.4 中 mb_substr() 支持负数 $offset,表示从字符串末尾开始计算位置,这点和 substr() 类似,但要注意多字节安全。
负数 offset 的含义
当 $offset 为负数时,mb_substr($str, -n) 表示从倒数第 n 个字符(按字符数,非字节数)开始,截取到末尾;mb_substr($str, -n, m) 表示从倒数第 n 个字符开始,向后取 m 个字符。
注意:这里的“第 n 个字符”是按 Unicode 字符计数,对中文、日文、emoji 等多字节字符也准确。
常见用法示例
-
mb_substr("你好世界", -2)→ "世界"(取末尾 2 个字符) -
mb_substr("Hello 世界", -4)→ "世界"(空格也算 1 字符,末尾 4 字符是 " 世界",但中文占 2 字符,实际结果是 " 世界") -
mb_substr("a?c", -2, 1)→ "?"(emoji 作为单个字符处理) -
mb_substr("测试abc", -3, 2)→ "ab"(末尾第 3 个字符是 'a',取 2 个:'a','b')
注意事项
- 必须指定正确的
$encoding参数(如'UTF-8'),否则负数 offset 可能行为异常或返回空 - 若
|offset| > 字符串总字符数,会从开头(位置 0)开始截取,不会报错 - 不支持像 Python 那样用
mb_substr($str, -3, -1)表示“末尾 3 个去掉最后 1 个”,PHP 不接受负的$length - 想实现类似效果,可先用
mb_strlen()计算长度再换算:例如取倒数第 3 到倒数第 1 个字符 →mb_substr($str, mb_strlen($str) - 3, 2)
替代方案:封装一个更灵活的函数
如果常需“从末尾截取 N 个字符”或“去掉末尾 M 个”,可简单封装:
function mb_right($str, $n, $enc = 'UTF-8') { return mb_substr($str, -$n, null, $enc); }function mb_chop_right($str, $n, $enc = 'UTF-8') { $len = mb_strlen($str, $enc); return $len > $n ? mb_substr($str, 0, $len - $n, $enc) : ''; }
这样调用更直观:mb_right("PHP7.4", 3) → "7.4"
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











