Filesystem 函数
在线手册:中文  英文

pathinfo

(PHP 4 >= 4.0.3, PHP 5)

pathinfo返回文件路径的信息

说明

mixed pathinfo ( string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )

pathinfo() 返回一个关联数组包含有 path 的信息。返回关联数组还是字符串取决于 options

参数

path

要解析的路径。

options

如果指定了,将会返回指定元素;它们包括:PATHINFO_DIRNAMEPATHINFO_BASENAMEPATHINFO_EXTENSIONPATHINFO_FILENAME

如果没有指定 options 默认是返回全部的单元。

返回值

如果没有传入 options ,将会返回包括以下单元的数组 arraydirnamebasenameextension(如果有),以 及filename

Note:

If the path does not have an extension, no extension element will be returned(以下第二个案例)。

If options is present, returns a string containing the requested element.

更新日志

版本 说明
5.2.0 添加了常量 PATHINFO_FILENAME

范例

Example #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"// since PHP 5.2.0
?>

以上例程会输出:

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

Example #2 pathinfo() example showing difference between null and no extension

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

注释

Note:

有关取得当前路径信息的说明,请阅读预定义变量一节。

Note:

pathinfo() is locale aware, so for it to parse a path containing multibyte characters correctly, the matching locale must be set using the setlocale() function.

参见


Filesystem 函数
在线手册:中文  英文

用户评论:

Jordan Doyle (2013-05-04 19:47:10)

It's worth nothing that pathinfo returns foo/index.php for the directory when dealing with URLs like foo/index.php/bar

krkbpk at gmail dot com RamaKrishna Kothamasu (2013-02-12 15:44:06)

//pathinfo function example
<?php
//passing single argument
echo "<pre>";
print_r(pathinfo("/home/ramki/ramki.pdf"));
echo 
"</pre>";
//passing two agruments
$path=array(PATHINFO_DIRNAME,PATHINFO_BASENAME,PATHINFO_EXTENSION,PATHINFO_FILENAME);
foreach (
$path as $value)
echo 
"<pre>".pathinfo("/home/ramki/ramki.pdf",$value)."</pre>";
?>
//output
/*
Array
(
    [dirname] => /home/ramki
    [basename] => ramki.pdf
    [extension] => pdf
    [filename] => ramki
)
/home/ramki
ramki.pdf
pdf
ramki
*/

Pietro Baricco (2012-02-10 16:00:33)

Use this function in place of pathinfo to make it work with UTF-8 encoded file names too

<?php
function mb_pathinfo($filepath) {
    
preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im',$filepath,$m);
    if(
$m[1]) $ret['dirname']=$m[1];
    if(
$m[2]) $ret['basename']=$m[2];
    if(
$m[5]) $ret['extension']=$m[5];
    if(
$m[3]) $ret['filename']=$m[3];
    return 
$ret;
}
?>

admin at torntech dot com (2011-06-27 09:39:38)

pathinfo will return null if 0 or null is specified for the option argument.
So you'll need to define it's value manually if the option field is omitted, to provide the default functionality.

<?php

    
public function getFileInfo($source null$option null){
        if(!
$option){
            
//1 + 2 + 4
            
$option PATHINFO_DIRNAME PATHINFO_BASENAME PATHINFO_EXTENSION;
            if(
defined('PATHINFO_FILENAME'))
                
$option += PATHINFO_FILENAME//8
        
}
        return 
pathinfo($source$option);
    }

    
$obj->getFileInfo("/test/file/someFile.txt");
?>

fabiolimasouto at gmail dot com (2010-10-14 12:53:05)

Sometimes we want to get an array of each component in the pathname associated with the correspondent path to that directory. We need it for creating breadCrumbs and stuff like that. So here it goes:
<?php

/* Function parsePathComponents 
    * parse through all path components
    * resolves the cross platform slash issue
    * eliminates extra redundant slashes
    * @return associative array: ComponentName=>CorrespondentPath
*/

/* Array */ 
function parsePathComponents($path,$endSlash=true,$base=false)
{
 for(
     
$path trim($path),
     
$slash strstr(PHP_OS,'WIN') ? '\/' '/',
     
$retArray = array(),
     
$str $temp "",
     
$x 0;
 
$char = @$path{$x}; $x++)
 { 
  if(!
strstr($slash,$char)) $temp .= $char;
  elseif(
$temp){
       
$str .= $temp;
       
$retArray[$temp] = $str.($endSlash $slash{0} : '');
       
$str .= $slash{0};
       
$temp "";
  }
 }
 
$base&&$temp and $retArray[$temp] = $str.$temp;
 return 
$retArray;
}

// Testing in WINDOWS
// NOTE: UNIX will return paths with normal slashes

// return array with path names ending with a slash
$path '/my//stupid//path/to///some/file.php';
$pathComps parsePathComponents($path);
print_r($pathComps);

//Array ( [my] => my\ [stupid] => my\stupid\ [path] => my\stupid\path\ [to] => my\stupid\path\to\ [some] => my\stupid\path\to\some\ ) 

$path 'my/other//path/';
// return paths not ending with slash
print_r(parsePathComponents($path,false));
// Array ( [my] => my [other] => my\other [path] => my\other\path )

$path 'my//other/path/to///file.php';
// use third argument = true: for capturing the "file.php" base
print_r(parsePathComponents($path,true,true));

//Array ( [my] => my\ [other] => my\other\ [path] => my\other\path\ [to] => my\other\path\to\ [file.php] => my\other\path\to\file.php )

?>

kc8yds at gmail dot com (2009-09-18 02:43:05)

any type of url parse_url can handle this will get the extension of
pathinfo(parse_url('URL GOES HERE',PHP_URL_PATH),PATHINFO_EXTENSION)

jjoss at mail dot ru (2009-02-04 10:15:11)

pathinfo() which can be used with UTF filenames.

<?php
  
function pathinfo_utf($path)
  {
    if (
strpos($path'/') !== false$basename end(explode('/'$path));
    elseif (
strpos($path'\\') !== false$basename end(explode('\\'$path));
    else return 
false;
    if (empty(
$basename)) return false;

    
$dirname substr($path0strlen($path) - strlen($basename) - 1);

    if (
strpos($basename'.') !== false)
    {
      
$extension end(explode('.'$path));
      
$filename substr($basename0strlen($basename) - strlen($extension) - 1);
    }
    else
    {
      
$extension '';
      
$filename $basename;
    }

    return array
    (
      
'dirname' => $dirname,
      
'basename' => $basename,
      
'extension' => $extension,
      
'filename' => $filename
    
);
  }
?>

aalaap at gmail dot com (2009-02-02 07:58:29)

Here is a simple function that gets the extension of a file. Simply using PATHINFO_EXTENSION will yield incorrect results if the path contains a query string with dots in the parameter names (for eg. &x.1=2&y.1=5), so this function eliminates the query string first and subsequently runs PATHINFO_EXTENSION on the clean path/url.

<?php
function extension($path) {
  
$qpos strpos($path"?");

  if (
$qpos!==false$path substr($path0$qpos);
  
  
$extension pathinfo($pathPATHINFO_EXTENSION);

  return 
$extension;
}
?>

php [spat] hm2k.org (2009-01-13 04:27:26)

A little compat for < 5.2

<?php

function pathinfo_filename($file) { //file.name.ext, returns file.name
    
if (defined('PATHINFO_FILENAME')) return pathinfo($file,PATHINFO_FILENAME);
    if (
strstr($file'.')) return substr($file,0,strrpos($file,'.'));
}

?>

php-manual at spunts dot net (2008-12-24 09:19:05)

For a good example of how platform independent this function is have a look at the different return values that Lostindream and I experienced. Mine is above and Lostindream's is below:
Array
(
[dirname] => /www/psychicblast/images/1
[basename] => my three girlfriends.jpg
[extension] => jpg
)
Array
(
[dirname] => /www/htdocs
[basename] => index.html
[extension] => html
[filename] => index
)
z

benjaminhill at gmail dot com (2008-12-02 21:18:10)

A warning: this function varies depending on the platform it is being run on. For example, pathinfo('C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe') will return a different result when run through a winOS PHP platform (local development) vs. a server's UNIX-based OS. A bit like the Locale settings, but unexpected.

Lostindream at atlas dot cz (2008-08-19 13:43:01)

at example from "qutechie at gmail dot com" you can only replace function 'strpos' with 'strrpos'. (strrpos — Find position of last occurrence of a char in a string)

It's simple. For example:
<?php

function filePath($filePath)
{
 
$fileParts pathinfo($filePath);

 if(!isset(
$fileParts['filename']))
 {
$fileParts['filename'] = substr($fileParts['basename'], 0strrpos($fileParts['basename'], '.'));}
  
 return 
$fileParts;
}
 
$filePath filePath('/www/htdocs/index.html');
print_r($filePath);
?>

Output will be:
Array
(
    [dirname] => /www/htdocs
    [basename] => index.html
    [extension] => html
    [filename] => index
)

leons87_AT_hotmail_DOT_com (2008-08-15 04:47:00)

qutechie at gmail dot com wrote a fix for support for filename in PHP 4; however it gets it wrong whenever you have a filename with a . in it (so foo.bar.jpg would return foo instead of foo.bar).

A fix would be:
<?php
if(!isset($path_parts['filename'])){
    
$reversed_filename strrev$path_parts['basename'] );
    
$path_parts['filename'] = strrevsubstr$reversed_filenamestrpos$reversed_filename'.' ) + ) );
}
?>

The idea is that you reverse the string and create a substring that starts after the first '.' and then reverse the result.

qutechie at gmail dot com (2008-07-21 18:29:59)

Quick fix for lack of support for 'filename' in php4

<?php
$path_parts 
pathinfo('/www/htdocs/index.html');

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

// if php4
              
if(!isset($path_parts['filename'])){
                
$path_parts['filename'] = substr($path_parts['basename'], 0,strpos($path_parts['basename'],'.'));
              }

?>

christian dot reinecke at web dot de (2008-02-24 07:46:58)

if you call pathinfo with a filename in url-style (example.php?with=parameter), make sure you remove the given parameters before, otherwise they will be returned as part of the extension.
extension => php?with=parameter

tom at foo-bar dot co dot uk (2008-01-30 06:48:09)

Note that this function seems to just perform string operations, and will work even on a non-existent path, e.g.

<?php
print_r
(pathinfo('/no/where/file.txt'));
?>

which will output:
Array
(
    [dirname] => /no/where
    [basename] => file.txt
    [extension] => txt
    [filename] => file
)

OakBehringer (2008-01-27 17:47:45)

Building on David Blinco's function, the following will:
1. Return the correct protocol for secure requests (https)
2. Throw an exception for invalid files
3. Ensure the returned url separates directories with forward slashes (David's will not on Windows systems).
function mapPath ($filepath) {
$realpath = realpath($filepath);
$dir;

// Verify that the path passed is real and harvest the bottom directory
if (is_file($realpath)) {
$dir = dirname($realpath);
}
elseif (is_dir($realpath)) {
$dir = $realpath;
}
else {
throw new Exception('File does not exist: ' . $realpath);
}
// Make sure the path is not lower than the server root
if (strlen($dir) < strlen($_SERVER['DOCUMENT_ROOT']))
throw new Exception("Cannot create http path below server http root.");

$path = ((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off') ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . substr($realpath, strlen($_SERVER['DOCUMENT_ROOT']));

if (DIRECTORY_SEPARATOR == '\\')
$path = str_replace('\\', '/', $path);
return $path;
}

davidblinco at gmail dot com (2008-01-26 07:27:30)

This function is not perfect, but you can use it to convert a relative path to a URL.
Please email me if you can make any improvements.

<?php
function mapURL($relPath) {
    
$filePathName realpath($relPath);
    
$filePath realpath(dirname($relPath));
    
$basePath realpath($_SERVER['DOCUMENT_ROOT']);
    
    
// can not create URL for directory lower than DOCUMENT_ROOT
    
if (strlen($basePath) > strlen($filePath)) {
        return 
'';
    }
    
    return 
'http://' $_SERVER['HTTP_HOST'] . substr($filePathNamestrlen($basePath));
}
?>

henrik at not-an-address dot com (2007-12-21 10:23:13)

If you have filename with utf-8 characters, pathinfo will strip them away:
print_r(pathinfo("/mnt/files/飛兒樂團光茫.mp3"));
.. will display:
Array
(
[dirname] => /mnt/files
[basename] => .mp3
[extension] => mp3
[filename] =>
)

mrnemesis at ntlworld dot com (2007-12-19 07:22:42)

Note that in PHP 4 (if you're stuck using it), pathinfo only provides dirname, basename, and extension, but not filename. This function will not split a file's stem and extension for you.

anders.jenbo()pc.dk (2007-09-11 14:34:45)

Heres a funciton to get the same results from php 4+ but you will have to call pathinfo_filename() instead of pathinfo().

<?php
if(version_compare(phpversion(), "5.2.0""<")) {
    function 
pathinfo_filename($path) {
        
$temp pathinfo($path);
        if(
$temp['extension'])
            
$temp['filename'] = substr($temp['basename'],,strlen($temp['basename'])-strlen($temp['extension'])-1);
        return 
$temp;
    }
} else {
    function 
pathinfo_filename($path) {
        return 
pathinfo($path);
    }
}
?>

avi-team at inbox dot lv (2007-07-15 08:14:14)

You shouldn't assign values as it is described in previous post
// wrong:
list( $dirname, $basename, $extension, $filename ) = array_values( pathinfo($file) );
if $file has no extension, you get wrong variable values: $extension would be assigned with 'filename' array element of pathinfo() result, but $filename - would be empty.

phpnet at whoisgregg dot com (2007-05-30 11:01:51)

If you want to easily assign the values returned by pathinfo to separate variable names, list isn't enough. You can use array_values() first to convert the associative array into the indexed array that list() expects:
// throws notices, variables aren't set
list( $dirname, $basename, $extension, $filename ) = pathinfo($file);
// works
list( $dirname, $basename, $extension, $filename ) = array_values( pathinfo($file) );

cochise_chiracahua at hotmail.com (2005-11-25 11:55:24)

Sometimes, it's interessant to get the basename without extension.
So, I appended a new entry 'basenameWE' (Basename Without Extension) to the returned array.

<?php

// pathinfo improved
function pathinfo_im($path) {
    
    
$tab pathinfo($path);
    
    
$tab["basenameWE"] = substr($tab["basename"],0
    
,strlen($tab["basename"]) - (strlen($tab["extension"]) + 1) );
    
    return 
$tab;
}

$my_path "/var/www/html/example.html";

echo 
"<pre>\n";
print_rpathinfo_im($my_path) );
echo 
"</pre>\n";

?>

Out :

Array
(
    [dirname] => /var/www/html
    [basename] => example.html
    [extension] => html
    [basenameWE] => example
)

sgermain at icexnetworks dot com (2005-07-08 11:24:08)

It is true that if you put a directory into pathinfo, usually the extension is empty. But, if the directory name is /www/example.com/ for example, you will have the following output:
Array
(
[dirname] => /www
[basename] => example.com
[extension] => com
)
So, it is the same as a file.

n0dalus (2005-02-08 01:47:52)

If a file has more than one 'file extension' (seperated by periods), the last one will be returned.
For example:
<?php
$pathinfo 
pathinfo('/dir/test.tar.gz');
echo 
'Extension: '.$pathinfo['extension'];
?>
will produce:
Extension: gz

and not tar.gz

(2004-12-03 04:39:29)

If you want only the file extension, use this:
<?php
$extension 
substr(strrchr($filename"."), 1);
?>
This is many times faster than using pathinfo() and getting the value from array.

rob at webdimension dot co dot uk (2004-10-04 06:48:29)

Further to my previous post.
This affects servers that run PHP as a cgi module
If you have your own server:
You can use the AcceptPathInfo directive to force the core handler to accept requests with PATH_INFO and thereby restore the ability to use PATH_INFO in server-side includes.
Further information:
http://httpd.apache.org/docs-2.0/mod/core.html#acceptpathinfo

junk at plaino dot com (2004-08-19 06:41:51)

Convert a URL to the local file path and vice versa, convert a local file path to a URL.
// this sets the sytem / or \ :
strstr( PHP_OS, "WIN") ? $slash = "\\" : $slash = "/";
// This is the location of the php file that contains this
// function. Usually this request is made to files/folders
// down the directory structure, so the php file that
// contains these functions is a good "where am i"
// reference point:
$WIMPY_BASE['path']['physical'] = getcwd();
$WIMPY_BASE['path']['www'] = "http://".$_SERVER['HTTP_HOST'];
function url2filepath($theURL){
global $WIMPY_BASE, $slash;
$AtheFile = explode ("/", $theURL);
$theFileName = array_pop($AtheFile);
$AwimpyPathWWW = explode ("/", $WIMPY_BASE['path']['www']);
$AtheFilePath = array_values (array_diff ($AtheFile, $AwimpyPathWWW));
if($AtheFilePath){
$theFilePath = $slash.implode($slash, $AtheFilePath).$slash.$theFileName;
} else {
$theFilePath = implode($slash, $AtheFilePath).$slash.$theFileName;
}
return ($WIMPY_BASE['path']['physical'].$theFilePath);
}
function filepath2url ($theFilepath){
global $WIMPY_BASE, $slash;
$AtheFile = explode ($slash, $theFilepath);
$theFileName = array_pop($AtheFile);
$AwimpyPathFILE = explode ($slash, $WIMPY_BASE['path']['physical']);
$AtheFilePath = array_values (array_diff ($AtheFile, $AwimpyPathFILE));
$thFileURL = implode("/", $AtheFilePath)."/".$theFileName;
return ($WIMPY_BASE['path']['www']."$thFileURL");
}

albertof at deltasoft dot com dot ar (2002-05-29 01:10:11)

This code is to work in index.php/var/var
if(isset($PATH_INFO)) {
$viewcode = explode('/', $PATH_INFO);
$num = count($viewcode);
if($num % 2 == 0) {
$viewcode[] = '';
$num++;
}
for($i = 1; $i < $num; $i += 2) {
$$viewcode[$i] = $viewcode[$i+1];
}
}

m-symons at home dot com (2001-08-24 19:01:45)

And, of course, to account for the problem noted in the first post whereby calling a directory, not a file, messes with the output of pathinfo(), you can include the following test:
if($pathinfo[extension] == "") {
$deep++;
}
Ooops...sorry for missing that.

m-symons at home dot com (2001-08-24 18:54:10)

Here's a neat wee function to grab the relative path to root (especially useful if you're using mock-directories to pass variables into scripts with mod_rewrite).  The function simply iterates through every occurence of "/" within the REQUEST_URI environment variable, appending "../" to the output for every instance:

<?php

function path_to_root($path) {

    
$pathinfo pathinfo($path);
    
    
$deep substr_count($pathinfo[dirname], "/");
    
    
$path_to_root "./";
    
    for(
$i 1$i <= $deep$i++) {
    
        
$path_to_root .= "../";
        
    }
    
    return 
$path_to_root;
}

path_to_root($REQUEST_URI);

?>

mikep at oeone dot com (2001-08-22 10:27:03)

If you run this on a directory, basename is the last directory in the path, dirname is the path before the final directory and extension is empty.

易百教程