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

PHP pathinfo()、dirname()、basename() 文件路徑解析函數詳解

     編輯:PHP 綜合知識

PHP 文件路徑解析三劍客:pathinfo、dirname、basename 完整指南

處理文件上傳、路徑拼接、文件名提取時,pathinfo()、dirname()、basename() 是最高頻使用的三個函數。本文通過實例詳細解析它們的返回值結構、邊界行為、平台差異與最佳實踐。

pathinfo():功能最全面

<?php
$path = "/www/mywebsite/images/myphoto.jpg";

$info = pathinfo($path);
print_r($info);
/*
Array
(
    [dirname] => /www/mywebsite/images
    [basename] => myphoto.jpg
    [extension] => jpg
    [filename] => myphoto        // PHP 5.2+ 新增
)
*/

// 直接提取單個元素
echo $info['filename'];  // myphoto
echo $info['extension']; // jpg

pathinfo() 參數控制返回值

<?php
pathinfo($path, PATHINFO_DIRNAME);   // "/www/mywebsite/images" (string)
pathinfo($path, PATHINFO_BASENAME);  // "myphoto.jpg"
pathinfo($path, PATHINFO_EXTENSION); // "jpg"
pathinfo($path, PATHINFO_FILENAME);  // "myphoto"

dirname():獲取目錄部分

<?php
echo dirname("/www/mywebsite/images/myphoto.jpg"); // /www/mywebsite/images
echo dirname("/www/mywebsite/images/");            // /www/mywebsite
echo dirname("/www/mywebsite/images");             // /www/mywebsite

// 遞歸獲取上 N 級目錄
$path = "/a/b/c/d.txt";
echo dirname($path, 2);  // PHP 7.0+ 支援第二參數:/a/b
行為:返回去掉「最後一級組件」後的路徑。若路徑以斜槓結尾,最後一級被視為目錄,返回其父目錄。

basename():獲取文件名部分

<?php
echo basename("/www/mywebsite/images/myphoto.jpg"); // myphoto.jpg
echo basename("/www/mywebsite/images/");            // images
echo basename("/www/mywebsite/images");             // images

// 移除副檔名
echo basename("/www/mywebsite/images/myphoto.jpg", ".jpg"); // myphoto
行為:返回路徑的「最後一級組件」。目錄路徑返回目錄名,文件路徑返回文件名。

平台差異與邊界情況

輸入pathinfo()dirname()basename()
/a/b/c.txtdirname=/a/b, basename=c.txt, ext=txt, filename=c/a/bc.txt
/a/b/dirname=/a, basename=b, ext=, filename=b/ab
/a/bdirname=/a, basename=b, ext=, filename=b/ab
c.txtdirname=., basename=c.txt, ext=txt, filename=c.c.txt
.htaccessfilename=.htaccess, ext=..htaccess
a.b.c.txtfilename=a.b.c, ext=txt.a.b.c.txt

Windows 路徑處理注意事項

<?php
// Windows 路徑含反斜槓
$winPath = "C:\\www\\images\\photo.jpg";

// pathinfo 自動識別雙斜槓
pathinfo($winPath); // 正常工作

// 但最佳實踐:統一使用 DIRECTORY_SEPARATOR 或正斜槓
$path = "C:/www/images/photo.jpg";  // PHP 內部統一支持正斜槓
// 或
$path = "C:" . DIRECTORY_SEPARATOR . "www" . DIRECTORY_SEPARATOR . "images" . DIRECTORY_SEPARATOR . "photo.jpg";

實戰組合技

<?php
// 1. 獲取不含副檔名的文件名
$filename = pathinfo($path, PATHINFO_FILENAME);

// 2. 修改副檔名保存
$newPath = pathinfo($path, PATHINFO_DIRNAME) . '/' . $filename . '.webp';

// 3. 獲取上傳文件擴展名(安全)
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
$allowed = ['jpg','png','gif','webp'];
if (!in_array($ext, $allowed)) die('類型不允許');

// 4. 構建緩存目錄結構:/cache/首字母/次字母/文件名
$hash = md5($filename);
$cacheDir = "/cache/{$hash[0]}/{$hash[1]}";
if (!is_dir($cacheDir)) mkdir($cacheDir, 0755, true);
$cacheFile = $cacheDir . '/' . $filename;

現代化替代:SplFileInfo (PHP 5.3+)

<?php
$file = new SplFileInfo("/www/images/photo.jpg");

echo $file->getFilename();      // photo.jpg
echo $file->getBasename('.jpg'); // photo
echo $file->getExtension();     // jpg
echo $file->getPath();          // /www/images
echo $file->getPathname();      // /www/images/photo.jpg
echo $file->getDirname();       // /www/images
echo $file->isFile();           // true
echo $file->getSize();          // 文件大小
echo $file->getMTime();         // 修改時間戳
✅ 面向對象、功能更豐富、可鏈式調用,新項目推薦使用 SplFileInfo。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved