常見寫法與缺陷
<?php
$file = 'abc.3434.342.12123.123.exe';
// 1. explode + 取最後元素
$arr = explode('.', $file);
echo $arr[count($arr)-1]; // exe
echo end($arr); // exe
echo array_pop($arr); // exe(會修改原陣列)
// 2. 遍歷取最後
foreach ($arr as $v) $last = $v;
echo $last; // exe
// 3. krsort + array_shift
krsort($arr);
echo array_shift($arr); // exe
// 4. pathinfo() 陣列
$info = pathinfo($file);
echo $info['extension']; // exe
// 5. pathinfo() 常數(推薦)
echo pathinfo($file, PATHINFO_EXTENSION); // exe
// 6. substr 固定長度(極不推薦)
echo substr($file, -3); // exe(副檔名非固定 3 字元時失效)
邊界測試
| 檔案名 | explode/end | pathinfo(EXTENSION) | 備註 |
test.txt | txt | txt | 正常 |
.htaccess | htaccess | htaccess | 隱藏檔視為無主檔名、有副檔名 |
archive.tar.gz | gz | gz | 雙副檔名僅取最後 |
/path/to/file | file | 空字串 | 無副檔名,explode 誤判 |
/path.with.dots/file | file | 空字串 | 路徑含點,explode 誤判 |
/path.with.dots/file.txt | txt | txt | 正常 |
結論
唯有 pathinfo($file, PATHINFO_EXTENSION) 能正確處理所有邊界:
- 無副檔名 → 回傳
""(不報警告)。
- 路徑含點 → 僅解析 basename 部分。
- 隱藏檔、雙副檔名 → 符合預期語意。
- 內建 C 實作,效能最佳。
補充:取得完整路徑資訊
$info = pathinfo('/www/htdocs/image.jpg');
/*
Array
(
[dirname] => /www/htdocs
[basename] => image.jpg
[extension] => jpg
[filename] => image
)
*/
可搭配 PATHINFO_DIRNAME/BASENAME/FILENAME/EXTENSION 常數單獨取值。
- 上一篇文章: PHP memory_limit 記憶體限制調整完整指南:查看、設定、失效排查
- 下一篇文章: ThinkPHP 開發第一個模組:Action 命名、預設動作、URL 參數綁定實戰
Copyright ©
程式碼之家 All Rights Reserved