文字

pathinfo

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

pathinfo返回文件路径的信息

说明

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

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

参数

path

要解析的路径。

options

如果指定了,将会返回指定元素;它们包括: PATHINFO_DIRNAME PATHINFO_BASENAME PATHINFO_EXTENSION PATHINFO_FILENAME

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

返回值

如果没有传入 options ,将会返回包括以下单元的数组 array dirnamebasenameextension(如果有),以 及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.

参见

  • dirname() - 返回路径中的目录部分
  • basename() - 返回路径中的文件名部分
  • parse_url() - 解析 URL,返回其组成部分
  • realpath() - 返回规范化的绝对路径名

用户评论:

[#1] wxb0328 at hotmail dot com [2015-05-19 02:08:36]

<?php

// your code goes here
echo phpversion();

print_r(pathinfo("/resources/img/stock/wxb001/????.png")); 

?????
5.6.4-2
Array
(
    [dirname] => /resources/img/stock/wxb001
    [basename] => ????.png
    [extension] => png
    [filename] => ????
)
??????php5.3.3?汾??
<?php

// your code goes here
echo phpversion();

print_r(pathinfo("/resources/img/stock/wxb001/????.png")); 
?????
5.3.3
Array
(
    [dirname] => /var/www/www.shima.jp.net/resources/img/stock/wxb001
    [basename] => .png
    [extension] => png
    [filename] => 
)

[#2] bart at mediawave dot nl [2015-02-23 12:55:20]

PHP equivalent for custom implementations. Will be nearly as fast or faster (with long paths):

<?php
$trimPath 
rtrim($path'/');

$slashPos strrpos($trimPath'/');
if (
$slashPos !== false) {
    
$dirName substr($trimPath0$slashPos) ?: '/';
    
$baseName substr($trimPath$slashPos 1);
} else {
    
$dirName '.';
    
$baseName $trimPath;
}

$dotPos strrpos($baseName'.');
if (
$dotPos !== false) {
    
$fileName substr($baseName0$dotPos);
    
$extension substr($baseName$dotPos 1);
} else {
    
$extension '';
    
$fileName $baseName;
}
?>

[#3] ivan dot dossev at gmail dot com [2015-02-21 12:06:04]

Note: dirname will be "." (meaning current directory) if the path is just a file name. (PHP 5.4.34)
<?php
var_dump
pathinfo('file.ext'PATHINFO_DIRNAME) ); // string(1) "."
?>

[#4] cmartinezme at hotmail dot com [2015-01-27 12:46:17]

Checked with version 5.5.12:

It works fine with filenames with utf-8 characters, pathinfo will strip them away:

<?php
print_r
(pathinfo("/mnt/files/?w?????F???.mp3"));
?>


.. will display:

Array
(
    [dirname] => /mnt/files
    [basename] => ?w?????F???.mp3
    [extension] => mp3
    [filename] => ?w?????F???
)

[#5] 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

[#6] 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

[#7] 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;
}
?>

[#8] 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");
?>

[#9] 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)

[#10] 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
    
);
  }
?>

[#11] 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;
}
?>

[#12] 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,'.'));
}

?>

[#13] 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

[#14] 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.

[#15] 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
)

[#16] 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.

[#17] 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'],'.'));
              }

?>

[#18] 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

[#19] 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
)

[#20] 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));
}
?>

[#21] 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/?w?????F???.mp3"));

 .. will display:

Array
(
    [dirname] => /mnt/files
    [basename] => .mp3
    [extension] => mp3
    [filename] => 
)

[#22] 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.

[#23] 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.

[#24] 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) );

[#25] 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
)

[#26] 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

[#27] [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.

[#28] 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

[#29] 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];

          }
    }

[#30] 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);

?>

上一篇: 下一篇: