
本文介绍多种 php 方法精准截取文件名主体,去除点号后的扩展名,避免硬编码长度导致的错误,并强调处理多级扩展、无扩展名等边界情况的最佳实践。
本文介绍多种 php 方法精准截取文件名主体,去除点号后的扩展名,避免硬编码长度导致的错误,并强调处理多级扩展、无扩展名等边界情况的最佳实践。
在 PHP 开发中,经常需要从带扩展名的文件名(如 1660807356design-1.pdf)中提取纯文件名部分(即 1660807356design-1)。初学者常误用 substr($str, 0, -4) 等硬编码方式,但这极易出错——例如扩展名长度不固定(.html、.tar.gz)、文件名本身含点(report.v2.1.txt),或根本无扩展名(README)时,将导致截断错误甚至 Notice 报错。
✅ 推荐方案:使用 pathinfo()(最健壮)
该函数专为路径/文件名解析设计,能正确识别真实扩展名(最后一个点之后的部分),且天然兼容各种边界场景:
$file = "1660807356design-1.pdf";
$basename = pathinfo($file, PATHINFO_FILENAME);
echo $basename; // 输出:1660807356design-1
// 其他用法示例:
var_dump(pathinfo("archive.tar.gz", PATHINFO_FILENAME)); // "archive.tar"
var_dump(pathinfo("README", PATHINFO_FILENAME)); // "README"
var_dump(pathinfo("photo.jpg", PATHINFO_EXTENSION)); // "jpg"⚠️ 注意:explode('.', $str)[0] 虽然简洁(如答案所给),但存在严重缺陷:它仅取第一个点前的部分,无法处理 data.config.json(应得 data.config,却返回 data)。因此不推荐用于生产环境。
? 其他可用方法(按推荐度排序):
-
strrpos()+substr():手动查找最后一个点位置$lastDot = strrpos($file, '.'); $name = ($lastDot !== false) ? substr($file, 0, $lastDot) : $file;
-
preg_replace()(正则):适用于需复杂规则的场景$name = preg_replace('/\.[^.]++$/', '', $file); // 移除末尾点及之后所有非点字符
? 总结:始终优先使用 pathinfo($file, PATHINFO_FILENAME)——它语义清晰、零依赖、经充分测试,是 PHP 官方推荐的标准解法。避免硬编码长度或简单 explode,以保障代码鲁棒性与可维护性。
立即学习“PHP免费学习笔记(深入)”;



















