©
このドキュメントでは、 php中国語ネットマニュアル リリース
(PHP 4 >= 4.0.3, PHP 5, PHP 7)
pathinfo — 返回文件路径的信息
$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 :dirname,basename
和 extension(如果有),以 及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.
[#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($trimPath, 0, $slashPos) ?: '/';
$baseName = substr($trimPath, $slashPos + 1);
} else {
$dirName = '.';
$baseName = $trimPath;
}
$dotPos = strrpos($baseName, '.');
if ($dotPos !== false) {
$fileName = substr($baseName, 0, $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($path, 0, strlen($path) - strlen($basename) - 1);
if (strpos($basename, '.') !== false)
{
$extension = end(explode('.', $path));
$filename = substr($basename, 0, strlen($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($path, 0, $qpos);
$extension = pathinfo($path, PATHINFO_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'], 0, strrpos($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'] = strrev( substr( $reversed_filename, strpos( $reversed_filename, '.' ) + 1 ) );
}
?>
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($filePathName, strlen($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_r( pathinfo_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);
?>