PHP擷取檔案擴充名的方法
上傳成功示例
array(5) {
["name"]=>
string(41) "測試.docx"
["type"]=>
string(24) "application/octet-stream"
["tmp_name"]=>
string(14) "/tmp/phpGbor6g"
["error"]=>
int(0)
["size"]=>
int(20793)
}
第1種方法:
$ext = substr(strrchr($upfile['name'], '.'), 1);
var_dump($ext);
結果: string(4) “docx”
第2種方法:
$ext = substr($upfile['name'], strrpos($upfile['name'], '.')+1);
var_dump($ext);
結果: string(4) “docx”
第3種方法:
$ext = end(explode('.', $upfile['name']));
var_dump($ext);
結果: string(4) “docx”
第4種方法:
$info = pathinfo($upfile['name']);
$ext = $info['extension'];
var_dump($ext);
結果: string(4) “docx”
第5種方法:
$ext = pathinfo($upfile['name'], PATHINFO_EXTENSION);
var_dump($ext);
結果: string(4) “docx”
前四種方法都有些小的問題。
要想完全正确擷取檔案的擴充名,必須要能處理以下三種特殊情況。
1.沒有檔案擴充名
2.路徑中包含了字元.,如/home/test.d/test.txt
3.路徑中包含了字元.,但檔案沒有擴充名。如/home/test.d/test
很明顯:
方法1、方法2不能處理第三種情況,
方法3不能正确處理第一三種情況。
方法4可以正确處理,但是在不存在擴充名時,會發出一個警告。
隻有第5種方法才是最正确的方法。
pathinfo — 傳回檔案路徑的資訊
mixed pathinfo (string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )
pathinfo() 傳回一個關聯數組包含有 path 的資訊。傳回關聯數組還是字元串取決于 options。
path
要解析的路徑。
options
如果指定了,将會傳回指定元素;
它們包括:
PATHINFO_DIRNAME - 目錄
PATHINFO_BASENAME - 檔案名(含擴充名)
PATHINFO_EXTENSION - 擴充名
PATHINFO_FILENAME - 檔案名(不含擴充名,PHP>5.2)
這四個常量的值分别是1、2、4、8,
如果沒有指定 options 預設是傳回全部的單元。
傳回值
如果沒有傳入 options ,将會傳回包括以下單元的數組 array:dirname,basename 和 extension(如果有),以 及filename。
例子:
<?php
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // since PHP 5.2.0
?>
以上例程會輸出:
/www/htdocs/inc
lib.inc.php
php
lib.inc
例子:
<?php
$path_parts = pathinfo('/path/emptyextension.');
var_dump($path_parts['extension']);
$path_parts = pathinfo('/path/noextension');
var_dump($path_parts['extension']);
?>
以上例程的輸出類似于:
string(0) ""
Notice: Undefined index: extension in test.php on line 6
NULL