獲取文件擴展名是文件上傳、驗證、重命名的高頻操作。本文對比 4 種主流方法的語法、邊界行為、性能與推薦場景,助你選最適合的一種。
$files = [
'image.jpg',
'archive.tar.gz',
'.htaccess',
'README',
'script.php.backup',
'/var/www/html/index.php',
'file.name.with.dots.txt',
'noextension',
];
pathinfo() —— 官方推薦、功能最全foreach ($files as $f) {
$ext = pathinfo($f, PATHINFO_EXTENSION);
echo "$f => [$ext]\n";
}
image.jpg => [jpg] archive.tar.gz => [gz] .htaccess => [] # 隱藏文件無擴展名 README => [] # 無點無擴展名 script.php.backup => [backup] /var/www/html/index.php => [php] file.name.with.dots.txt => [txt] noextension => []
false/nullexplode() + array_pop() —— 簡潔但有陷阱function getExtExplode($filename) {
return array_pop(explode('.', $filename));
}
.htaccess => [htaccess] # 誤判隱藏文件 README => [README] # 無點時返回整個文件名 /var/www/html/index.php => [php] # 路徑中含點目錄會誤判
function getExtExplodeFixed($filename) {
$basename = basename($filename); // 先取文件名
if ($basename[0] === '.') return ''; # 隱藏文件直接返回空
$parts = explode('.', $basename);
return count($parts) > 1 ? array_pop($parts) : '';
}
strrchr() + substr() —— 老派寫法function getExtStrrchr($filename) {
$dot = strrchr($filename, '.');
return $dot ? substr($dot, 1) : '';
}
需配合 basename() 與首字符判斷修正。
SplFileInfo —— 面向對象、現代化foreach ($files as $f) {
$info = new SplFileInfo($f);
echo "$f => [" . $info->getExtension() . "]\n";
}
pathinfo() 一致pathinfo(),行為完全一致SplFileInfo 做文件操作的代碼庫(new SplFileInfo($f))->getExtension()| 方法 | 耗時(秒) | 相對 |
|---|---|---|
pathinfo() | 0.42 | 1.00x |
SplFileInfo | 0.58 | 1.38x |
explode+pop | 0.31 | 0.74x |
strrchr+substr | 0.28 | 0.67x |
結論:原生字符串函數最快,但 pathinfo() 差距微小且正確性最高,實際項目**強烈推薦 pathinfo()**。
| 場景 | 推薦方法 | 理由 |
|---|---|---|
| 通用業務代碼 | pathinfo($file, PATHINFO_EXTENSION) | 正確、可讀、標準庫 |
| 已用 SplFileInfo 物件 | $fileInfo->getExtension() | 風格統一 |
| 極高頻熱點路徑(百萬級/秒) | strrchr(basename($f), '.') + 手動修正 | 極致性能,需自行處理邊界 |
| 模板引擎/配置文件解析 | pathinfo() | 無性能壓力,求穩 |
// 最穩 $ext = pathinfo($filename, PATHINFO_EXTENSION); // 最快(自行保證輸入為純文件名、非隱藏文件) $ext = substr(strrchr($filename, '.'), 1);
選對方法,少踩坑,代碼更健壯。