PHP中的pathinfo函數(shù)是一個(gè)非常有用的函數(shù),它可以方便地把一個(gè)路徑解析成一個(gè)關(guān)聯(lián)數(shù)組,其中包含了路徑中的文件名、目錄名和擴(kuò)展名等各個(gè)部分。這個(gè)函數(shù)在一些web開(kāi)發(fā)中尤其常用,比如在上傳文件時(shí),我們需要獲取上傳文件的文件名和擴(kuò)展名等信息。下面,我們來(lái)看看pathinfo函數(shù)的工作原理。
首先,我們來(lái)看一下pathinfo函數(shù)的基本用法:
$path = '/var/www/html/index.php'; $info = pathinfo($path); print_r($info);
上面的代碼將會(huì)輸出如下結(jié)果:
Array ( [dirname] => /var/www/html [basename] => index.php [extension] => php [filename] => index )
從上面的結(jié)果可以看出,pathinfo函數(shù)返回的是一個(gè)關(guān)聯(lián)數(shù)組,其中包含了路徑中的各個(gè)部分。下面我們來(lái)看看這個(gè)函數(shù)的具體實(shí)現(xiàn)。
pathinfo函數(shù)的實(shí)現(xiàn)原理非常簡(jiǎn)單,其實(shí)就是對(duì)字符串進(jìn)行分割和匹配。具體來(lái)說(shuō),它會(huì)先檢查傳入的$path字符串是否以“/”結(jié)尾,如果不是,則在末尾加上一個(gè)“/”,然后再對(duì)其進(jìn)行分割。這個(gè)分割過(guò)程主要有兩個(gè)步驟:
// 檢查路徑是否以“/”結(jié)尾 if (substr($path, -1) != '/') { $path .= '/'; } // 分割路徑 $parts = explode('/', $path);
這里我們用一個(gè)例子來(lái)說(shuō)明分割的過(guò)程。假設(shè)$path為“/var/www/html/index.php”,則分割后的結(jié)果是這樣的:
Array ( [0] => [1] => var [2] => www [3] => html [4] => index.php )
分割完成后,pathinfo函數(shù)會(huì)根據(jù)數(shù)組$parts中的最后一個(gè)元素來(lái)確定文件名、擴(kuò)展名和basename等信息。具體來(lái)說(shuō),它會(huì)根據(jù)最后一個(gè)元素中的“.”來(lái)分割文件名和擴(kuò)展名。
// 獲取basename和extension $filename = array_pop($parts); $basename = substr($filename, 0, strrpos($filename, '.')); $extension = substr($filename, strrpos($filename, '.') + 1);
這里的array_pop函數(shù)是用來(lái)獲取$parts數(shù)組中的最后一個(gè)元素的,而strrpos函數(shù)則是用來(lái)獲取最后一個(gè)“.”的位置。這樣,我們就可以得到文件名、擴(kuò)展名和basename等信息了。
最后,我們來(lái)看一下pathinfo函數(shù)的一些參數(shù)。pathinfo函數(shù)可以接受一個(gè)可選的第二個(gè)參數(shù)$path_parts,它是一個(gè)常量數(shù)組,其用來(lái)指定返回的值。這個(gè)數(shù)組中可以有以下三個(gè)元素:
- PATHINFO_DIRNAME:目錄名部分
- PATHINFO_BASENAME:文件名部分
- PATHINFO_EXTENSION:擴(kuò)展名部分
- PATHINFO_FILENAME:不包含擴(kuò)展名的文件名部分
例如,如果我們只需要獲取文件名和擴(kuò)展名,可以這樣使用pathinfo函數(shù):
$info = pathinfo($path, PATHINFO_BASENAME | PATHINFO_EXTENSION);
這樣,我們就只會(huì)得到文件名和擴(kuò)展名兩個(gè)部分了。
總之,pathinfo函數(shù)是一個(gè)非常有用的函數(shù),它可以方便地把一個(gè)路徑解析成一個(gè)關(guān)聯(lián)數(shù)組,其中包含了路徑中的文件名、目錄名和擴(kuò)展名等各個(gè)部分。其實(shí)現(xiàn)原理也比較簡(jiǎn)單,只需要一些基本的字符串分割和匹配即可。當(dāng)然,pathinfo函數(shù)還有很多高級(jí)用法,具體可以參考PHP官方文檔。