首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 獲取文件擴展名的最佳實踐:道法自然,拒絕正則過度

     編輯:PHP 相關知識

核心函數

<?php
/**
 * 獲取文件擴展名(小寫)
 * @param string $path 文件路徑或文件名
 * @return string 擴展名,無則返回空字符串
 */
function getFileExtension(string $path): string
{
    // 1. 統一路徑分隔符,去除目錄部分
    $filename = basename(str_replace('\\', '/', $path));
    
    // 2. 利用 pathinfo 解析(內建處理多點、隱藏文件、無擴展名等邊界情況)
    return strtolower(pathinfo($filename, PATHINFO_EXTENSION));
}

// 測試用例
$tests = [
    'D://a\b\name-Of_somefile.File.txt',
    '/var/www/html/.htaccess',
    'archive.tar.gz',
    'README',
    'image.jpeg',
    'script.PHP',
    'path/with.dots/and/more.dots/file.min.js',
];

foreach ($tests as $t) {
    echo "$t  =>  " . getFileExtension($t) . PHP_EOL;
}
/* 輸出:
D://a\b\name-Of_somefile.File.txt  =>  txt
/var/www/html/.htaccess  =>  
archive.tar.gz  =>  gz
README  =>  
image.jpeg  =>  jpeg
script.PHP  =>  php
path/with.dots/and/more.dots/file.min.js  =>  js
*/

為什麼不用 `explode('.', $str)`?

場景explode 方案pathinfo 方案
隱藏文件 `.htaccess`誤判為 `htaccess`正確返回空
多層擴展 `tar.gz`取第一段 `tar`正確取最後段 `gz`
無擴展名 `README`返回 `README`正確返回空
路徑含點 `dir.name/file`需先 `basename` 再處理內建 `basename` + 解析
大小寫 `File.PHP`需額外 `strtolower`同樣需 `strtolower`

進階:嚴格白名單驗證

function isAllowedExtension(string $filename, array $allowList): bool
{
    $ext = getFileExtension($filename);
    return in_array($ext, array_map('strtolower', $allowList), true);
}

// 使用示例
$allowed = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
if (isAllowedExtension($_FILES['avatar']['name'], $allowed)) {
    // 通過擴展名初步過濾,隨後必須配合 MIME 類型、文件頭魔數二次驗證
}

總結

  • 首選 `pathinfo($filename, PATHINFO_EXTENSION)`:C 層實現,性能最優,邊界情況處理完備。
  • 配合 `basename()` 先剝離目錄,避免路徑干擾。
  • 統一轉小寫對比,消除大小寫敏感問題。
  • 切記:擴展名僅作前端提示/初步過濾,安全驗證必須檢查 MIME (`finfo_file`) 與文件頭魔數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved