PHP 8.0 中 substr() 第三个参数支持负数,表示从末尾排除指定数量字符;如 substr('hello world', 0, -1) 返回 'hello worl',负值超长则返回空字符串,推荐直接使用负 length 而非手动计算长度。

PHP 8.0 中,substr() 的第三个参数 $length 支持负数,表示从字符串末尾向前截取(不包含末尾指定数量的字符)。若想“省略末尾 N 个字符”,直接传入负数即可,无需额外计算长度。
负数 length 的作用逻辑
当 $length 为负数时,substr($string, $start, $length) 会返回从 $start 位置开始、到倒数第 |$length| 个字符之前的部分(即自动排除末尾 |$length| 个字符)。
-
substr('hello world', 0, -1)→ 'hello worl'(去掉末尾 1 个字符) -
substr('hello world', 0, -6)→ 'hello'(去掉末尾 6 个字符:' world') -
substr('abc', 0, -5)→ ''(负数绝对值超过字符串长度,返回空字符串)
常用省略末尾字符的写法
最典型场景是去掉文件扩展名、换行符或固定后缀:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 去掉换行符:
substr($str, 0, -1)(假设末尾只有一个\n) - 去掉扩展名(简单版):
substr($filename, 0, strrpos($filename, '.'))或更简洁地用pathinfo(),但若已知扩展名长度为 4(如 '.php'),可写substr($filename, 0, -4) - 安全去末尾字符(防越界):
substr($str, 0, max(0, strlen($str) - $n)),但通常直接传负数已足够健壮
注意与 substr_replace 的区别
substr() 负 length 是“截取前缀”,不是“替换”。若需真正“删除末尾子串”(比如删掉固定的后缀),且不确定长度,建议结合 str_ends_with()(PHP 8.0+)判断后再截取:
if (str_ends_with($str, '.txt')) { $str = substr($str, 0, -4); }- 避免硬编码长度出错,也防止误删(如
'data.txt.bak'用-4会错删)
不推荐的写法
不要用 strlen() 手动算正向长度再传,既冗余又易错:
- ❌
substr($str, 0, strlen($str) - 3)(不如直接substr($str, 0, -3)) - ❌ 忘记检查长度导致空字符串被截成 false(实际 PHP 会静默返回空串,但逻辑易混淆)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










