PHP 5.4.33 Released

basename

(PHP 4, PHP 5)

basenameRetourne le nom du fichier dans un chemin

Description

string basename ( string $path [, string $suffix ] )

Prend en paramètre path, le chemin complet d'un fichier et en extrait le nom du fichier.

Liste de paramètres

path

Un chemin.

Sous Windows, les caractères (/) et antislash (\) sont utilisés comme séparateurs de dossier. Sous les autres OS, seul le caractère slash (/) est utilisé.

suffix

Si suffix est fourni, le suffixe sera aussi supprimé.

Valeurs de retour

Retourne le nom de base du chemin path.

Exemples

Exemple #1 Exemple avec basename()

<?php
echo "1) ".basename("/etc/sudoers.d"".d").PHP_EOL;
echo 
"2) ".basename("/etc/passwd").PHP_EOL;
echo 
"3) ".basename("/etc/").PHP_EOL;
echo 
"4) ".basename(".").PHP_EOL;
echo 
"5) ".basename("/");
?>

L'exemple ci-dessus va afficher :

1) sudoers
2) passwd
3) etc
4) .
5) 

Notes

Note:

basename() agit de manière naïve et n'est pas au courant du système de fichiers sous-jacent ou des composantes d'un chemin telles que "..".

Note:

basename() est sensible à la locale, donc si le chemin possède des caractères multi-octets, la locale qui convient doit être enregistrée au moyen de la fonction setlocale().

Voir aussi

  • dirname() - Renvoie le nom du dossier parent
  • pathinfo() - Retourne des informations sur un chemin système

add a note add a note

User Contributed Notes 24 notes

up
11
jonmsawyer at gmail dot com
7 years ago
@antrik at users dot sf dot net
> 15-Nov-2004 10:40
> When using basename() on a path to a directory
> ('/bar/foo/'), the last path component ('foo') is returned,
> instead of the empty string one would expect. (Both PHP
> 4.1.2 and 4.3.8 on GNU/Linux.) No idea whether this is
> considered a bug or a feature -- I found it extremely
> annoying. Had to work around using: <?php
> $file=substr($path, -1)=='/'?'':basename($path)
>
?> Watch out!

There is a reason behind this -- and it has nothing to do with being a feature. PHP was heavily modeled off of the POSIX model. Many of the same functions you see in PHP are also in C, C++, and Java. These languages are modeled on POSIX as well.

The directory '/bar/foo/', when passed into the function basename(), will output 'foo' because *everything*, including directories, in the POSIX model, is a _file_. Most unix platforms, and all Windows platforms are (some Linux distributions are not) fully compliant to the POSIX model.

For example, the device file that contains information about your harddisk, in Linux, is probably stored in the _file_ /dev/hda.

Another example is that when you want to list information about your CPU or Memory using the Linux kernel, you might read the _file_ /proc/cpu/info.

Directories are no exception. Directories are no more different than your regular text file -- other than the fact that they describe a _file_-list of all files under it, and where the OS can access them. This means that even directories treat other directories as files.

The reason why we are made to think that directories are not files is because the kernel (the OS) simply treats these culprits differently. Your OS is lying to you! When you try to open up c:\windows in Notepad, you simply get a runaround because the Windows operating system knows it is a directory and knows how to treat it -- and knowing this it will not let you open it up for editing. For if you did that, you would probably lose the data in that directory. If you are familiar with C programming, you will know that if you lose information about a pointer to an object, the object gets lost in memory. The same would happen if you modified a directory in the wrong way. This is why the operating system protects its directories with the upmost care. (Some do anyway, hehe)

So when doing any kind of programming in PHP, C/++, Java, Ada, Perl, Python, Ruby, FORTRAN, and yes, even RPG IV (for all of you AS/400 folks out there working on the IFS), you must treat directories as files well.

This is why 'foo' is returned. For more information on POSIX, see http://en.wikipedia.org/wiki/POSIX

I hope this helps. Cheers.
up
4
crash at subsection dot org dot uk
8 years ago
A simple way to return the current directory:
$cur_dir = basename(dirname($_SERVER[PHP_SELF]))

since basename always treats a path as a path to a file, e.g.

/var/www/site/foo/ indicates /var/www/site as the path to file
foo
up
5
lazy lester
8 years ago
If your path has a query string appended, and if the query string contains a "/" character, then the suggestions for extracting the filename offered below don't work.

For instance if the path is like this:
http://www.ex.com/getdat.php?dep=n/a&title=boss

Then both the php basename() function, and also
the $_SERVER[QUERY_STRING] variables get confused.

In such a case, use:

<php
$path_with_query="http://www.ex.com/getdat.php?dep=n/a&title=boss";
$path=explode("?",$path_with_query);
$filename=basename($path[0]);
$query=$path[1];
?>
up
7
stephane dot fidanza at gmail dot com
7 years ago
Support of the $suffix parameter has changed between PHP4 and PHP5:
in PHP4, $suffix is removed first, and then the core basename is applied.
conversely, in PHP5, $suffix is removed AFTER applying core basename.

Example:
<?php
  $file
= "path/to/file.xml#xpointer(/Texture)";
  echo
basename($file, ".xml#xpointer(/Texture)");
?>

Result in PHP4: file
Result in PHP5: Texture)
up
3
leaksin [ at ] gmail [ dot ] com
1 year ago
This is a string function,too.
basename() does not check the current path for being exist or not.
It's great to use it for working with URL or search implement.
up
2
swedish boy
4 years ago
Here is a quick way of fetching only the filename (without extension) regardless of what suffix the file has.

<?php

// your file
$file = 'image.jpg';

$info = pathinfo($file);
$file_name basename($file,'.'.$info['extension']);

echo
$file_name; // outputs 'image'

?>
up
1
thoughts at highermind dot org
7 years ago
Basename without query string:

<?php
$filename   
= array_shift(explode('?', basename($url_path)));
?>
up
1
zandor_zz at yahoo dot it
6 years ago
It might be useful to have a version of the function basename working with arrays too.

<?php
function a_basename( $file, $exts )
{
   
$onlyfilename = end( explode( "/", $file ) );

    if(
is_string( $exts ) )
    {
        if (
strpos( $onlyfilename, $exts, 0 ) !== false )
       
$onlyfilename = str_replace( $exts, "", $onlyfilename );
    }
    else if (
is_array( $exts ) )
    {
       
// works with PHP version <= 5.x.x
       
foreach( $exts as $KEY => $ext )
        {
           
$onlyfilename = str_replace( $ext, "", $onlyfilename );
        }
    }

    return
$onlyfilename ;
}
?>
up
1
icewind
8 years ago
Because of filename() gets "file.php?var=foo", i use explode in addition to basename like here:

$file = "path/file.php?var=foo";
$file = explode("?", basename($file));
$file = $file[0];
$query = $file[1];

Now $file only contains "file.php" and $query contains the query-string (in this case "var=foo").
up
1
(remove) dot nasretdinov at (remove) dot gmail dot com
6 years ago
There is only one variant that works in my case for my Russian UTF-8 letters:

<?php
function mb_basename($file)
{
    return
end(explode('/',$file));
}
><

It is intented for UNIX servers
up
0
adrian at foeder dot de
6 years ago
On windows systems, filenames are case-insensitive. If you have to make sure the right case is used when you port your application to an unix system, you may use a combination of the following:

<?php
//assume the real filename is mytest.JPG:

$name_i_have = "mytest.jpg";
$realfilename = basename(realpath($name_i_have));
?>

basename itself does not check the filesystem for the given file, it does, so it seems, only string-manipulation.
With realpath() you can "extend" this functionality.
up
0
amitabh at NOSPAM dot saysnetsoft dot com
9 years ago
The previous example posted by "pvollma" didn't work out for me, so I modified it slightly:
<?php
function GetFileName($file_name)
{
       
$newfile = basename($file_name);
        if (
strpos($newfile,'\\') !== false)
        {
               
$tmp = preg_split("[\\\]",$newfile);
               
$newfile = $tmp[count($tmp) - 1];
                return(
$newfile);
        }
        else
        {
                return(
$file_name);
        }
}
?>
up
0
pvollma at pcvsoftware dot net
9 years ago
There is a real problem when using this function on *nix servers, since it does not handle Windows paths (using the \ as a separator). Why would this be an issue on *nix servers? What if you need to handle file uploads from MS IE? In fact, the manual section "Handling file uploads" uses basename() in an example, but this will NOT extract the file name from a Windows path such as C:\My Documents\My Name\filename.ext. After much frustrated coding, here is how I handled it (might not be the best, but it works):

<?php
$filen
= stripslashes($_FILES['userfile']['name']);
$newfile = basename($filen);
if (
strpos($newfile,'\\') !== false) {
 
$tmp = preg_split("[\\\]",$newfile);
 
$newfile = $tmp[count($tmp) - 1];
}
?>

$newfile will now contain only the file name and extension, even if the POSTed file name included a full Windows path.
up
0
KOmaSHOOTER at gmx dot de
9 years ago
if you want the name of the parent directory
<?php
$_parenDir_path
= join(array_slice(split( "/" ,dirname($_SERVER['PHP_SELF'])),0,-1),"/").'/'; // returns the full path to the parent dir
$_parenDir basename ($_parenDir_path,"/"); // returns only the name of the parent dir
// or
$_parenDir2 = array_pop(array_slice(split( "/" ,dirname($_SERVER['PHP_SELF'])),0,-1)); // returns also only the name of the parent dir
echo('$_parenDir_path  = '.$_parenDir_path.'<br>');
echo(
'$_parenDir  = '.$_parenDir.'<br>');
echo(
'$_parenDir2  = '.$_parenDir2.'<br>');
?>
up
0
KOmaSHOOTER at gmx dot de
9 years ago
If you want the current path where youre file is and not the full path then use this :)

<?php
echo('dir = '.basename (dirname($_SERVER['PHP_SELF']),"/"));   
// retuns the name of current used directory
?>

Example:

www dir: domain.com/temp/2005/january/t1.php

<?php
echo('dirname <br>'.dirname($_SERVER['PHP_SELF']).'<br><br>');   
// returns: /temp/2005/january
?>

<?php
echo('file = '.basename ($PHP_SELF,".php"));   
// returns: t1
?>

if you combine these two you get this
<?php
echo('dir = '.basename (dirname($_SERVER['PHP_SELF']),"/"));   
// returns: january
?>

And for the full path use this
<?php
echo(' PHP_SELF <br>'.$_SERVER['PHP_SELF'].'<br><br>');
// returns: /temp/2005/january/t1.php   
?>
up
0
KOmaSHOOTER at gmx dot de
10 years ago
Exmaple for exploding ;) the filename to an array

<?php
echo(basename ($PHP_SELF)."<br>");  // returnes filename.php
$file = basename ($PHP_SELF);
$file = explode(".",$file);
print_r($file);    // returnes Array ( [0] => filename [1] => php )
echo("<br>");
$filename = basename(strval($file[0]),$file[1]);
echo(
$filename."<br>");  // returnes  filename
echo(basename ($PHP_SELF,".php")."<br>");  // returnes  filename
echo("<br>");
echo(
"<br>");
//show_source(basename ($PHP_SELF,".php").".php")
show_source($file[0].".".$file[1])
?>
up
-1
giovanni at giacobbi dot net
10 years ago
No comments here seems to take care about UNIX system files, which typically start with a dot, but they are not "extensions-only".
The following function should work with every file path. If not, please let me know at my email address.

<?php

function remove_ext($str) {
 
$noext = preg_replace('/(.+)\..*$/', '$1', $str);
  print
"input: $str\n";
  print
"output: $noext\n\n";
}

remove_ext("/home/joh.nny/test.php");
remove_ext("home/johnny/test.php");
remove_ext("weirdfile.");
remove_ext(".hiddenfile");
remove_ext("../johnny.conf");
up
-2
pvollma at pcvsoftware dot net
9 years ago
Note that in my example below, I used the stripslashes function on the target string first because I was dealing with the POST array $_FILES. When creating this array, PHP will add slashes to any slashes it finds in the string, so these must be stripped out first before processing the file path. Then again, the only reason I can think of that basename() would fail is when dealing with Windows paths on a *nix server -- and the file upload via POST is the only situation I can think of that would require this. Obviously, if you are not dealing with these additional slashes, invoking stripslashes() first would remove the very separators you need extract the file name from the full path.
up
-1
www.turigeza.com
8 years ago
simple but not said in the above examples

echo basename('somewhere.com/filename.php?id=2', '.php');
will output
filename.php?id=2

which is not the filename in case you expect!
up
-1
pai dot ravi at yahoo dot com
6 years ago
once you have extracted the basename from the full path and want to separate the extension from the file name, the following function will do it efficiently:

<?php
function splitFilename($filename)
{
   
$pos = strrpos($filename, '.');
    if (
$pos === false)
    {
// dot is not found in the filename
       
return array($filename, ''); // no extension
   
}
    else
    {
       
$basename = substr($filename, 0, $pos);
       
$extension = substr($filename, $pos+1);
        return array(
$basename, $extension);
    }
}
?>
up
-1
daijoubu_NOSP at M_videotron dot ca
10 years ago
An faster alternative to:

<?php
array_pop
(explode('.', $fpath));
?>

would be:

<?php
substr
($fpath, strrpos($fpath, '.')); // returns the dot
?>

If you don't want the dot, simply adds 1 to the position

<?php
substr
($fpath, strrpos($fpath, '.') + 1); // returns the ext only
?>
up
-1
hello at haroonahmad dot co dot uk
6 years ago
I got a blank output from this code

$cur_dir = basename(dirname($_SERVER[PHP_SELF]))

suggested earlier by a friend here.

So anybody who wants to get the current directory path can use another technique that I use as

//suppose you're using this in pageitself.php page

$current_dir=dirname(realpath("pageitself.php"));

I hope it helps.
up
-1
Anonymous
8 years ago
icewinds exmaple wouldn't work, the query part would contain the second char of the filename, not the query part of the url.
<?
$file = "path/file.php?var=foo";
$file = explode("?", basename($file));
$query = $file[1];
$file = $file[0];
?>

That works better.
up
-2
Muhammad El-Saeed muhammad at elsaeed dot info
1 year ago
to get the base url of my website

function url(){
    $base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
    $base_url .= '://'. $_SERVER['HTTP_HOST'];
    $base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']); 
    return $base_url;
}
To Top