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

PHP 獲取文件擴展名的 5 種方法:唯有 pathinfo() 最靠譜

     編輯:PHP 綜合知識

五種常見寫法對比

<?php
$str = 'as.da.efg'; // 測試字符串:含多個點、無真實路徑

// 1. strrchr + substr
echo substr(strrchr($str, "."), 1) . "\n"; // efg

// 2. strrpos + substr
echo substr($str, strrpos($str, ".") + 1) . "\n"; // efg

// 3. explode + end
echo end(explode('.', $str)) . "\n"; // efg

// 4. pathinfo() 返回數組
$file = pathinfo($str);
echo $file['extension'] . "\n"; // efg

// 5. pathinfo() 指定常量(推薦)
echo pathinfo($str, PATHINFO_EXTENSION) . "\n"; // efg
?>

三大邊界測試案例

測試路徑預期結果方法 1-3方法 4方法 5 ✅
/home/test.d/test.txttxt✅ txt✅ txt✅ txt
/home/test.d/test無擴展名❌ 返回 test⚠️ 警告 + 空✅ 空字符串
test無擴展名❌ 返回 test⚠️ 警告 + 空✅ 空字符串
.htaccess隱藏文件無擴展名❌ 返回 htaccess⚠️ 警告✅ 空字符串

為什麼前四種方法都不靠譜?

  1. strrchr/strrpos:只找最後一個點,無法區分「目錄名含點」與「真實擴展名」
  2. explode + end:同理,且 .htaccess 會誤判為擴展名
  3. pathinfo() 無常量:無擴展名時返回數組不包含 extension 鍵,觸發 Undefined array key 警告

pathinfo() 完整返回結構

<?php
$path = '/www/htdocs/your_image.jpg';
print_r(pathinfo($path));

/* 輸出:
Array
(
    [dirname] => /www/htdocs
    [basename] => your_image.jpg
    [extension] => jpg
    [filename] => your_image   // PHP 5.2+
)
*/
?>

四大常量詳解

常量值含義返回類型
PATHINFO_DIRNAME1目錄路徑string
PATHINFO_BASENAME2文件名(含擴展名)string
PATHINFO_EXTENSION4擴展名(無點)string|空字符串
PATHINFO_FILENAME8文件名(不含擴展名)string

注意: 常量值為位掩碼,但 不支持位運算組合,pathinfo($file, PATHINFO_EXTENSION | PATHINFO_FILENAME) 只會返回值最小的常量(即 DIRNAME)。

生產環境最佳封裝

<?php
/**
 * 安全獲取文件擴展名(小寫、無點)
 * @param string $path 文件路徑或文件名
 * @return string 擴展名,無則返回空字符串
 */
function getExtension(string $path): string {
    // pathinfo 內部已處理路徑分隔符、隱藏文件、多點等邊界情況
    $ext = pathinfo($path, PATHINFO_EXTENSION);
    return strtolower($ext);
}

// 測試
var_dump(getExtension('/home/test.d/test.txt')); // "txt"
var_dump(getExtension('/home/test.d/test'));     // ""
var_dump(getExtension('.htaccess'));             // ""
var_dump(getExtension('archive.tar.gz'));        // "gz" (只取最後一段)
?>

補充:獲取完整 MIME 類型

<?php
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file('/path/to/file.png'); // image/png
// 比單純擴展名更可靠,防偽裝上傳
?>

結論:永遠使用 pathinfo($path, PATHINFO_EXTENSION),標準庫已幫你處理好所有邊界情況,別再造輪子了。

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