在PHP开发中,判断文件扩展名是文件处理环节的常见需求,比如上传文件时校验文件类型、批量处理特定格式文件等场景都需要用到。不同的实现方式在边界情况处理上表现不同,下面介绍几种常用的实现方法。

使用pathinfo函数获取扩展名
pathinfo是PHP内置的专门用于解析文件路径信息的函数,它会返回一个包含文件路径各个部分的数组,其中extension键对应的就是文件的扩展名,这是最推荐的使用方式。
示例代码如下:
<?php $filePath = 'test/image.jpg'; // 解析文件路径信息 $pathInfo = pathinfo($filePath); // 获取扩展名,不存在时返回空字符串 $extension = $pathInfo['extension'] ?? ''; echo $extension; // 输出 jpg // 也可以直接传入PATHINFO_EXTENSION参数获取扩展名 $extension2 = pathinfo($filePath, PATHINFO_EXTENSION); echo $extension2; // 输出 jpg ?>
这种方式的优势是会自动处理路径中的点号,即使文件名中包含多个点号,也能正确提取最后一个点号后的内容作为扩展名,同时如果文件没有扩展名,会返回空值,不需要额外做过多的边界判断。
使用explode函数分割获取扩展名
explode函数可以按照指定的分隔符分割字符串,我们可以用点号作为分隔符,分割文件路径后取最后一个元素作为扩展名。
示例代码如下:
<?php
$filePath = 'test/document.tar.gz';
// 用点号分割路径字符串
$parts = explode('.', $filePath);
// 取最后一个元素作为扩展名
$extension = end($parts);
echo $extension; // 输出 gz
// 如果文件没有点号,end会返回整个文件名,需要做判断
$filePath2 = 'test/readme';
$parts2 = explode('.', $filePath2);
$extension2 = count($parts2) > 1 ? end($parts2) : '';
echo $extension2; // 输出 空字符串
?>
这种方式的缺点是如果文件名中有多个点号,会直接取最后一个点号后的内容,对于类似tar.gz这种复合扩展名,只能获取到gz,如果需要保留完整的复合扩展名,这种方式就不太适用。
使用strrchr函数查找最后一个点号
strrchr函数可以查找字符串中最后一次出现指定字符的位置,并返回该位置之后的所有字符,我们可以用它找到最后一个点号,再截取点号后的内容作为扩展名。
示例代码如下:
<?php $filePath = 'test/avatar.png'; // 查找最后一个点号的位置并返回之后的内容 $extPart = strrchr($filePath, '.'); // 去掉点号得到扩展名 $extension = $extPart ? substr($extPart, 1) : ''; echo $extension; // 输出 png // 处理没有扩展名的情况 $filePath2 = 'test/config'; $extPart2 = strrchr($filePath2, '.'); $extension2 = $extPart2 ? substr($extPart2, 1) : ''; echo $extension2; // 输出 空字符串 ?>
这种方式的实现逻辑和pathinfo类似,但是需要手动处理截取逻辑,代码量比直接使用pathinfo要多一些,不过也能正确应对大部分场景。
扩展名判断的注意事项
获取到扩展名之后,判断时需要注意以下几点:
- 扩展名的大小写问题,比如
JPG和jpg属于同一种扩展名,判断时可以先统一转为小写再比较。 - 不要仅依赖扩展名判断文件类型,因为扩展名可以被伪造,重要场景下需要结合文件内容校验,比如读取文件头信息判断真实类型。
- 如果处理用户上传的文件,建议同时校验MIME类型,提升文件校验的安全性。
下面是统一转为小写判断扩展名的示例:
<?php
$filePath = 'test/photo.JPG';
$extension = strtolower(pathinfo($filePath, PATHINFO_EXTENSION));
// 判断是否为图片扩展名
$allowExts = ['jpg', 'png', 'gif', 'jpeg'];
if (in_array($extension, $allowExts)) {
echo '是允许的图片类型';
} else {
echo '不允许的文件类型';
}
?>