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_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION и PATHINFO_FILENAME.

Если options не указан, то возвращаются все доступные элементы.

Возвращаемые значения

Если параметр options не передан, то возвращаемый ассоциативный массив (array) будет содержать следующие элементы: dirname, basename, extension (если есть) и filename.

Замечание:

Если path не содержит расширения, то не будет возвращен элемент extension (см. ниже второй пример).

Если указан параметр options, будет возвращена строка (string), содержащая указанный элемент.

Список изменений

Версия Описание
5.2.0 Добавлена константа PATHINFO_FILENAME.

Примеры

Пример #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"// начиная с PHP 5.2.0
?>

Результат выполнения данного примера:

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

Пример #2 Пример с pathinfo(), показывающий разницу между null и отсутствием расширения.

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

Notice: Undefined index: extension in test.php on line 6
NULL

Примечания

Замечание:

Подробнее о получении информации о текущем пути, обратитесь к секции " Предопределенные зарезервированные переменные".

Замечание:

pathinfo() учитывает настройки локали, поэтому для корректной обработки пути с многобайтными символами должна быть установлена соответствующая локаль с помощью функции setlocale().

Смотрите также

  • dirname() - Возвращает имя родительского каталога из указанного пути
  • basename() - Возвращает последний компонент имени из указанного пути
  • parse_url() - Разбирает URL и возвращает его компоненты
  • realpath() - Возвращает канонизированный абсолютный путь к файлу

Коментарии

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);

?>
2001-08-24 21:54:10
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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];

          }
    }
2002-05-29 04:10:11
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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
2004-10-04 09:48:29
http://php5.kiev.ua/manual/ru/function.pathinfo.html
Автор:
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.
2004-12-03 06:39:29
http://php5.kiev.ua/manual/ru/function.pathinfo.html
Автор:
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
2005-02-08 03:47:52
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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
)
2005-11-25 13:55:24
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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) );
2007-05-30 14:01:51
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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.
2007-07-15 11:14:14
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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.
2007-12-19 09:22:42
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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] => 
)
2007-12-21 12:23:13
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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));
}
?>
2008-01-26 09:27:30
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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
)
2008-01-30 08:48:09
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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
2008-02-24 09:46:58
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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'],'.'));
              }

?>
2008-07-21 21:29:59
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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.
2008-08-15 07:47:00
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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
)
2008-08-19 16:43:01
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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.
2008-12-02 23:18:10
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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
2008-12-24 11:19:05
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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,'.'));
}

?>
2009-01-13 06:27:26
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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;
}
?>
2009-02-02 09:58:29
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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
   
);
  }
?>
2009-02-04 12:15:11
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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)
2009-09-18 05:43:05
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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");
?>
2011-06-27 12:39:38
http://php5.kiev.ua/manual/ru/function.pathinfo.html
Автор:
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;
}
?>
2012-02-10 18:00:33
http://php5.kiev.ua/manual/ru/function.pathinfo.html
//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
*/
2013-02-12 17:44:06
http://php5.kiev.ua/manual/ru/function.pathinfo.html
Автор:
It's worth nothing that pathinfo returns foo/index.php for the directory when dealing with URLs like foo/index.php/bar
2013-05-04 22:47:10
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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/飛兒樂團光茫.mp3"));
?>

.. will display:

Array
(
    [dirname] => /mnt/files
    [basename] => 飛兒樂團光茫.mp3
    [extension] => mp3
    [filename] => 飛兒樂團光茫
)
2015-01-27 14:46:17
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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) "."
?>
2015-02-21 14:06:04
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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;
}
?>
2015-02-23 14:55:20
http://php5.kiev.ua/manual/ru/function.pathinfo.html
<?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] => 
)
2015-05-19 05:08:36
http://php5.kiev.ua/manual/ru/function.pathinfo.html
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. 

Reality:
var_dump(pathinfo('中国人2016.xls'));
exit();
array(4) { 'dirname' => string(1) "." 'basename' => string(8) "2016.xls" 'extension' => string(3) "xls" 'filename' => string(4) "2016" } 

Expect(Solve):
setlocale(LC_ALL, 'zh_CN.UTF-8');
var_dump(pathinfo('中国人2016.xls'));
exit();
array(4) { 'dirname' => string(1) "." 'basename' => string(17) "中国人2016.xls" 'extension' => string(3) "xls" 'filename' => string(13) "中国人2016" }
2016-06-15 06:02:33
http://php5.kiev.ua/manual/ru/function.pathinfo.html
Автор:
Lightweight way to get extension for *nix systems
<?php
function get_extension($path)
{
   
$c preg_match('#[^\/]+\.([^\.]*)$#uis'$path$tmp);
    return 
$c $tmp[1] : null;
}
?>
this will return NULL for dotfiles (hidden files)

Testing:
<?php
$test 
= array(
   
'/normal_dir/normal.foo',
   
'/double_ext.foo.bar',
   
'/.hidden/empty_ext.',
   
'/.hidden_dir/.hidden_file',
   
'/foo.bar/no_ext'
);
foreach(
$test as $path) {
   
var_dump(parse_extension($path));
}
?>

results:
string(3) "foo"
string(3) "bar"
string(0) ""
NULL
NULL

if you want to get all extensions (substring of file name after first dot) use another expression:
<?php
$c 
preg_match('#[^\.|\/]+\.([^\/]*)$#uis'$path$tmp);
?>
2016-12-08 13:02:06
http://php5.kiev.ua/manual/ru/function.pathinfo.html
Note that pathinfo($somePath, PATHINFO_EXTENSION) will return '' (empty string) for both of these paths:

- some_random_file
- another_strange_file_ending_in_dot.

That's good, but then note that pathinfo($somePath, PATHINFO_FILENAME) won't end in the dot for 'another_strange_file_ending_in_dot.' - you'll need pathinfo($somePath, PATHINFO_BASENAME) to get the original filename ending in a dot.

Hope this helps!
2016-12-23 13:38:10
http://php5.kiev.ua/manual/ru/function.pathinfo.html
Автор:
Simple example of pathinfo and array destructuring in PHP 7:
<?php
'basename' => $basename'dirname' => $dirname ] = pathinfo('/www/htdocs/inc/lib.inc.php');

var_dump($basename$dirname);

// result:
// string(11) "lib.inc.php"
// string(15) "/www/htdocs/inc"
?>
2018-09-21 16:40:30
http://php5.kiev.ua/manual/ru/function.pathinfo.html
Here is an enhanced version of pathinfo() that interprets multi-part extensions like tar.gz as one file extension:

<?php
function pathinfo_enhanced($file_path) {
 
$core_path_info pathinfo($file_path);
 
$filename $core_path_info['filename'];

  if (isset(
$core_path_info['extension'])) {
   
$extension $core_path_info['extension'];
  } else {
   
$extension '';
  }

 
$extension_parts = array();

  while (!empty(
$extension)) {
   
array_unshift($extension_parts$extension);

   
$remaining_path_info pathinfo($filename);
   
$filename $remaining_path_info['filename'];

    if (isset(
$remaining_path_info['extension'])) {
     
$extension $remaining_path_info['extension'];
    } else {
     
$extension '';
    }
  }

 
$revised_path_info = array(
   
'filename'  => $filename,
   
'extension' => implode('.'$extension_parts),
  );

  return 
array_merge($core_path_info$revised_path_info);
}

// === EXAMPLES ===

// Directory; two extensions
$path '/www/htdocs/inc/file.tar.gz';
$info pathinfo_enhanced($path);

echo 
"$path\n";
print_r($info);
echo 
"\n";

// Directory; one extension
$path '/www/htdocs/inc/file.tgz';
$info pathinfo_enhanced($path);

echo 
"$path\n";
print_r($info);
echo 
"\n";

// Directory; no extension
$path '/www/htdocs/inc/lib';
$info pathinfo_enhanced($path);

echo 
"$path\n";
print_r($info);
echo 
"\n";

// No directory; one extension
$path 'test.php';
$info pathinfo_enhanced($path);

echo 
"$path\n";
print_r($info);
echo 
"\n";

// No directory; dot file
$path '.example';
$info pathinfo_enhanced($path);

echo 
"$path\n";
print_r($info);
echo 
"\n";

// Directory only
$path '/www/htdocs/inc/';
$info pathinfo_enhanced($path);

echo 
"$path\n";
print_r($info);
echo 
"\n";
2018-12-20 05:08:47
http://php5.kiev.ua/manual/ru/function.pathinfo.html

    Поддержать сайт на родительском проекте КГБ