Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : Filesystem Functions : pathinfo

pathinfo

Returns information about a file path (PHP 4 >= 4.0.3, PHP 5)
mixed pathinfo ( string path [, int options] )

Example 664. pathinfo() Example

<?php
$path_parts
= pathinfo('/www/htdocs/index.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
?>

The above example will output:

/www/htdocs
index.php
html
index

Related Examples ( Source code ) » pathinfo


Code Examples / Notes » pathinfo

avi-team

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.


albertof

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];
         }
   }


cochise_chiracahua

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
)


sgermain

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.


phpnet

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


03-dec-2004 12:39

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.


mikep

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.

n0dalus

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


anders.jenbo pc.dk

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'],0 ,strlen($temp['basename'])-strlen($temp['extension'])-1);
return $temp;
}
} else {
function pathinfo_filename($path) {
return pathinfo($path);
}
}
?>


m-symons

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


rob

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

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


m-symons

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.


Change Language


Follow Navioo On Twitter
basename
chgrp
chmod
chown
clearstatcache
copy
delete
dirname
disk_free_space
disk_total_space
diskfreespace
fclose
feof
fflush
fgetc
fgetcsv
fgets
fgetss
file_exists
file_get_contents
file_put_contents
file
fileatime
filectime
filegroup
fileinode
filemtime
fileowner
fileperms
filesize
filetype
flock
fnmatch
fopen
fpassthru
fputcsv
fputs
fread
fscanf
fseek
fstat
ftell
ftruncate
fwrite
glob
is_dir
is_executable
is_file
is_link
is_readable
is_uploaded_file
is_writable
is_writeable
lchgrp
lchown
link
linkinfo
lstat
mkdir
move_uploaded_file
parse_ini_file
pathinfo
pclose
popen
readfile
readlink
realpath
rename
rewind
rmdir
set_file_buffer
stat
symlink
tempnam
tmpfile
touch
umask
unlink
eXTReMe Tracker