用 pathinfo() 拆解路径再拼接可安全预览新文件名,它准确提取 dirname、filename(不含点)、extension(仅最后点后),支持多级扩展名和中文,避免手动截取出错。

PHP 文件名替换前如何预览新名称
直接用 pathinfo() 和字符串操作生成新文件名,不执行重命名,就能看到效果。关键不是“先改再看”,而是“先算再比对”。
用 pathinfo() 拆解原始路径再拼接
这是最稳妥的预览方式——它能正确处理带目录、多级扩展名(如 .tar.gz)、中文名等边界情况,避免手动 substr() 或 strrpos() 出错。
-
pathinfo($old_path, PATHINFO_DIRNAME)取目录部分 -
pathinfo($old_path, PATHINFO_FILENAME)取不含扩展名的主体(不含点) -
pathinfo($old_path, PATHINFO_EXTENSION)取扩展名(仅最后一个点之后)
例如原始路径是 /var/uploads/report_v1.2.pdf,PATHINFO_FILENAME 返回 report_v1.2,不是 report_v1 —— 这点容易被忽略。
常见替换场景与预览代码示例
以下代码只输出新文件名,不调用 rename():
立即学习“PHP免费学习笔记(深入)”;
$old_path = '/home/user/photo (2).jpg';
$info = pathinfo($old_path);
$new_filename = preg_replace('/[^\w\s-]/u', '', $info['filename']); // 去除非字母数字空格横线
$new_filename = preg_replace('/\s+/', '-', $new_filename); // 空格转短横
$new_filename = trim($new_filename, '-');
$new_path = $info['dirname'] . '/' . $new_filename . '.' . $info['extension'];
echo $new_path; // 输出:/home/user/photo-2.jpg
注意:preg_replace() 的 /u 修饰符必须加,否则中文会变乱码;trim($new_filename, '-') 防止开头或结尾残留短横。
为什么不用 basename() + str_replace() 直接搞
因为 basename() 无法区分 file.tar.gz 的主名和扩展名,str_replace('.jpg', '.png', $name) 在文件名本身含 .jpg(如 version_1.0.jpg.log)时会误替换。而 pathinfo() 基于真实扩展名解析,更可靠。
另外,Windows 下大小写不敏感,但 PHP 的 rename() 在 Linux 下严格区分大小写,预览时若只改大小写(如 FILE.JPG → file.jpg),需确认目标文件系统是否允许同名覆盖——这点常被跳过,导致上线后报 File exists 错误。











