PHP 8.0 中用 strrpos() 定位最后一点,再用 substr() 截取扩展名和主文件名;需配合 basename() 防路径干扰,多字节字符须用 mb_substr(),多级扩展推荐 pathinfo($filename, PATHINFO_EXTENSION)。

PHP 8.0 中用 substr() 截取文件名的后缀(扩展名)和前缀(主文件名),关键在于先找到点号(.)的位置,再结合 strlen() 和负数偏移来精准截取。注意:直接用 substr() 处理扩展名需小心多级扩展(如 .tar.gz),常规单扩展场景下完全可行。
获取文件名后缀(扩展名)
用 strrpos() 找最后一个点的位置,再用 substr() 从该位置后一位开始截取到末尾:
$filename = "report_v2.1.pdf";-
$dotPos = strrpos($filename, '.');—— 返回11(最后一点的索引) -
$ext = $dotPos !== false ? substr($filename, $dotPos + 1) : '';→ "pdf"
⚠️ 不要用 substr($filename, -4) 这类固定长度方式,因为扩展名长度不固定(如 .html 是 5 位,.js 是 3 位)。
获取文件名前缀(不含扩展名的主体)
同样依赖 strrpos() 定位最后一个点,然后用 substr() 从开头截取到该位置前:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
-
$prefix = $dotPos !== false ? substr($filename, 0, $dotPos) : $filename;→ "report_v2.1" - 如果文件名无点号(如
"README"),strrpos返回false,此时整个字符串就是前缀
更健壮的写法(兼容无扩展、隐藏文件等)
实际项目中建议加一层判断,避免路径干扰(比如含目录):
- 先用
basename()提取纯文件名:$name = basename($filepath); - 再按上述逻辑处理
$name,防止/var/www/image.jpg被误截成/www/image.jpg - 若需支持多级扩展(如
archive.tar.gz),应改用pathinfo($filename, PATHINFO_EXTENSION),它原生识别常见复合扩展
小提醒:别混淆 substr 和 mb_substr
如果文件名含中文、emoji 或其他 UTF-8 多字节字符(如 "我的报告.pdf"),substr() 可能截断字节导致乱码。此时必须用 mb_substr($filename, $start, $length, 'UTF-8'),并确保 mbstring 扩展已启用。


















