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

PHP 路徑處理函數大全:realpath、dirname、pathinfo、basename 詳解

     編輯:PHP 相關知識

函數速查表

函數功能檢查文件存在性回傳值範例
realpath($path)返回規範化絕對路徑(解析 . .. 符號連結)✅ 是(不存在回傳 false)/var/www/html/index.php
dirname($path)返回路徑的目錄部分❌ 否/var/www/html
basename($path, $suffix)返回路徑的文件名部分,可選移除後綴❌ 否index.php / index (搭配 .php)
pathinfo($path, $options)返回路徑資訊關聯陣列❌ 否['dirname'=>'...', 'basename'=>'...', 'extension'=>'php', 'filename'=>'index']

詳細行為差異

realpath() — 唯一檢查存在性

<?php
echo realpath('./../index.php');      // /var/www/index.php (解析相對路徑)
echo realpath('/var/www/link.php');   // /var/www/target.php (解析符號連結)
echo realpath('/not/exist.php');      // false
?>

**用途**:安全路徑驗證、防止目錄遍歷攻擊、獲取項目根目錄 realpath(__DIR__ . '/../')。

dirname() / basename() — 純字串操作

<?php
$path = '/var/www/html/index.php';
echo dirname($path);        // /var/www/html
echo basename($path);       // index.php
echo basename($path, '.php'); // index

// 即使文件不存在也正常工作
echo dirname('/fake/path/file.txt'); // /fake/path
?>

pathinfo() — 一次性獲取所有資訊

<?php
$path = '/var/www/html/image.png';
$info = pathinfo($path);
/*
Array(
    [dirname] => /var/www/html
    [basename] => image.png
    [extension] => png
    [filename] => image
)
*/

// 只需特定資訊,用常數(效能略優)
echo pathinfo($path, PATHINFO_EXTENSION); // png
echo pathinfo($path, PATHINFO_FILENAME);  // image
?>

實戰組合技

<?php
// 1. 獲取項目根目錄(遞歸向上找標誌文件)
function getProjectRoot($start = __DIR__) {
    $dir = realpath($start);
    while ($dir && $dir !== '/') {
        if (file_exists($dir . '/composer.json')) return $dir;
        $dir = dirname($dir);
    }
    return false;
}

// 2. 安全包含文件(防止目錄遍歷)
function safeInclude($relativePath, $baseDir = __DIR__) {
    $fullPath = realpath($baseDir . '/' . $relativePath);
    $baseDir = realpath($baseDir);
    if ($fullPath && strpos($fullPath, $baseDir) === 0) {
        return include $fullPath;
    }
    throw new Exception('Invalid path');
}

// 3. 處理上傳文件名(保留副檔名,主文件名安全化)
function sanitizeFilename($original) {
    $info = pathinfo($original);
    $safeName = preg_replace('/[^a-zA-Z0-9_-]/', '', $info['filename']);
    return $safeName . '.' . strtolower($info['extension']);
}
?>

跨平台注意事項

  • Windows 路徑分隔符 \,PHP 函數**統一支援 /**,建議全程使用 /
  • DIRECTORY_SEPARATOR 常數適配當前系統,但現代 PHP 內部已統一處理
  • 符號連結行為:Linux 解析真實路徑,Windows 捷徑 .lnk **不會**被 realpath 解析

總結

**記住一句口訣**:「realpath 查真身,dirname 取目錄,basename 取名字,pathinfo 全要」**。根據需求選擇:需驗證存在用 realpath,純字串拆解用 dirname/basename/pathinfo,效能與語義最優。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved