2024 年 PHP Conference Japan

pathinfo

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

pathinfo傳回檔案路徑的相關資訊

說明

pathinfo(字串 $path, 整數 $flags = PATHINFO_ALL): 陣列|字串

pathinfo() 會回傳關於 path 的資訊:根據 flags 的設定,回傳值可能是關聯式陣列或字串。

注意事項:

關於如何取得目前的 path info,請閱讀預先定義的保留變數的章節。

注意事項:

pathinfo() 會直接處理輸入的字串,並不會考量實際的檔案系統,或是路徑組成部分,例如 ".."。

注意事項:

僅在 Windows 系統上,\ 字元會被視為目錄分隔符號。在其他系統上,它會被視為一般字元。

警告

pathinfo() 與語系相關,因此若要正確解析包含多位元組字元的路徑,必須使用 setlocale() 函式設定對應的語系。

參數

path

要解析的路徑。

flags

若有指定,則指定要回傳的特定元素;可以是 PATHINFO_DIRNAMEPATHINFO_BASENAMEPATHINFO_EXTENSIONPATHINFO_FILENAME 其中之一。

如果未指定 flags,則會回傳所有可用的元素。

回傳值

如果未傳入 flags 參數,則會回傳一個包含以下元素的關聯式 陣列dirnamebasenameextension(如果有的話)和 filename

注意事項:

如果 path 擁有多個副檔名,PATHINFO_EXTENSION 只會回傳最後一個,而 PATHINFO_FILENAME 也只會移除最後一個。(請參考下面的第一個範例)。

注意事項:

如果 path 沒有副檔名,則不會回傳 extension 元素(請參考下面的第二個範例)。

注意事項:

如果 pathbasename 以點號開頭,則後面的字元會被視為 extension,而 filename 會是空的(請參考下面的第三個範例)。

如果指定了 flags,則會回傳一個包含所請求元素的 字串

範例

範例 #1 pathinfo() 範例

<?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";
?>

上述範例會輸出:

/www/htdocs/inc
lib.inc.php
php
lib.inc

範例 #2 pathinfo() 範例,顯示空副檔名與無副檔名的差異

<?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

範例 #3 pathinfo() 針對點檔案的範例

<?php
print_r
(pathinfo('/some/path/.test'));
?>

上述範例將輸出類似以下的內容:

Array
(
    [dirname] => /some/path
    [basename] => .test
    [extension] => test
    [filename] =>
)

範例 #4 pathinfo() 使用陣列解構的範例

flags 參數不是位元遮罩。只能提供單一值。要僅選取有限的一組解析值,請使用如下所示的陣列解構:

<?php
['basename' => $basename, 'dirname' => $dirname] = pathinfo('/www/htdocs/inc/lib.inc.php');

var_dump($basename, $dirname);
?>

上述範例將輸出類似以下的內容:

string(11) "lib.inc.php"
string(15) "/www/htdocs/inc"

另請參閱

新增註釋

使用者貢獻的註釋 3 則註釋

Pietro Baricco
12 年前
使用此函數代替 pathinfo,使其也能夠處理 UTF-8 編碼的檔案名稱

<?php
函式 mb_pathinfo($filepath) {
preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im',$filepath,$m);
如果(
$m[1]) $ret['dirname']=$m[1];
如果(
$m[2]) $ret['basename']=$m[2];
如果(
$m[5]) $ret['extension']=$m[5];
如果(
$m[3]) $ret['filename']=$m[3];
返回
$ret;
}
?>
urvi
2 年前
關於路徑,您需要注意一件事
在 Windows 上,斜線 (/) 和反斜線 (\) 都被用作目錄分隔字元。在其他環境中,則是正斜線 (/)。(此說明來自 basename() 函式部分 https://php.dev.org.tw/manual/en/function.basename.php
範例
<?php
$path
= "https://urvidutta.com /a\b\c\filename.pdf";

echo
pathinfo($pdfUrl, PATHINFO_BASENAME); //取得基檔名
//輸出
//在 Windows 上:結果是 filename.pdf
//在 Linux 上:結果是 a\b\c\filename.pdf(這可能不是您預期的)

//因此,為了在不同系統中獲得相同的結果,我會先執行以下操作。
$path = str_replace($path, '\\', '/'); //將 '\' 轉換為 '/'
?>
n0dalus
19 年前
如果檔案擁有多個「副檔名」(以句點分隔),則會傳回最後一個。
例如
<?php
$pathinfo
= pathinfo('/dir/test.tar.gz');
echo
'副檔名:'.$pathinfo['extension'];
?>
會產生
副檔名:gz

而不是 tar.gz
To Top