
本文介绍多种 PHP 方法精准截取文件名主体(去除点号及之后的扩展名),重点讲解 explode()、pathinfo() 和 strrpos() 的使用场景与注意事项,避免硬编码长度导致的错误。
本文介绍多种 php 方法精准截取文件名主体(去除点号及之后的扩展名),重点讲解 `explode()`、`pathinfo()` 和 `strrpos()` 的使用场景与注意事项,避免硬编码长度导致的错误。
在 PHP 开发中,经常需要从带扩展名的文件字符串(如 "1660807356design-1.pdf")中提取纯文件名(即 "1660807356design-1")。初学者常误用 substr($str, 0, -4) 等硬编码方式——这不仅无法适配不同扩展名(如 .jpg、.html、.tar.gz),还会在无扩展名或含多个点(如 "archive.v1.2.zip")时出错。
推荐以下三种健壮、通用的解决方案:
✅ 方法一:explode() + [0](适用于简单单点分隔)
$str = "1660807356design-1.pdf";
$filename = explode('.', $str)[0];
echo $filename; // 输出:1660807356design-1⚠️ 注意:仅适用于扩展名不含点的常规情况(如 .pdf, .png),若文件名为 "data.tar.gz",此法会错误返回 "data"(而非 "data.tar")。
✅ 方法二:pathinfo()(最推荐,语义清晰且安全)
$str = "1660807356design-1.pdf"; $filename = pathinfo($str, PATHINFO_FILENAME); echo $filename; // 输出:1660807356design-1
pathinfo() 是 PHP 原生专用于路径解析的函数,能正确识别最后一段点号后的扩展名,天然支持多级扩展(如 "file.tar.gz" → "file.tar"),且不依赖字符串位置,强烈建议生产环境优先使用。
立即学习“PHP免费学习笔记(深入)”;
✅ 方法三:strrpos() + substr()(手动定位最后一个点)
$str = "1660807356design-1.pdf"; $lastDot = strrpos($str, '.'); $filename = $lastDot !== false ? substr($str, 0, $lastDot) : $str; echo $filename; // 输出:1660807356design-1
该方法显式查找最后一个点号位置,再截取前缀,逻辑清晰、兼容性强,适合需自定义处理逻辑的场景(例如保留点号但删除扩展名后加后缀)。
❌ 避免硬编码截取
// 错误示例:假设所有扩展名都是 4 字符(含点),实际 .jpg 只有 4 字符,.txt 只有 4 字符?不,是 4 字符包括点 → ".txt" 长度为 4,".pdf" 也是 4,但 ".htaccess" 是 10! $file = substr($items['pdf_name'], 0, -4); // 危险!不可靠
总结建议:
- 日常开发首选
pathinfo($str, PATHINFO_FILENAME)—— 语义明确、健壮可靠、无需额外判断; - 若需极致性能且确认文件名格式简单(无多点扩展),可用
explode('.', $str)[0]; - 自定义逻辑复杂时,用
strrpos()手动控制更灵活; - 永远不要硬编码扩展名长度,否则将引发难以排查的边界问题。



















