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

PHP 獲取文件擴展名 4 種方法對比:pathinfo、explode、strrchr、SplFileInfo

     編輯:PHP 綜合知識

獲取文件擴展名是文件上傳、驗證、重命名的高頻操作。本文對比 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/null
  • PHP 所有版本可用,首選

方法二:explode() + 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()

性能微基準(100 萬次循環)

方法耗時(秒)相對
pathinfo()0.421.00x
SplFileInfo0.581.38x
explode+pop0.310.74x
strrchr+substr0.280.67x

結論:原生字符串函數最快,但 pathinfo() 差距微小且正確性最高,實際項目**強烈推薦 pathinfo()**。

綜合推薦表

場景推薦方法理由
通用業務代碼pathinfo($file, PATHINFO_EXTENSION)正確、可讀、標準庫
已用 SplFileInfo 物件$fileInfo->getExtension()風格統一
極高頻熱點路徑(百萬級/秒)strrchr(basename($f), '.') + 手動修正極致性能,需自行處理邊界
模板引擎/配置文件解析pathinfo()無性能壓力,求穩

一行代碼速查

// 最穩
$ext = pathinfo($filename, PATHINFO_EXTENSION);

// 最快(自行保證輸入為純文件名、非隱藏文件)
$ext = substr(strrchr($filename, '.'), 1);

選對方法,少踩坑,代碼更健壯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved