basename

(PHP 4, PHP 5)

basenameВозвращает последний компонент имени из указанного пути

Описание

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

При передаче строки с путем к файлу или каталогу, данная функция вернет последний компонент имени из данного пути.

Список параметров

path

Путь.

На платформах Windows в качестве разделителей имен директорий используются оба слэша (прямой / и обратный \). В других операционных системах разделителем служит прямой слэш (/).

suffix

Если компонент имени заканчивается на suffix, то он также будет отброшен.

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

Возвращает базовое имя указанного пути path.

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

Версия Описание
4.1.0 Добавлен параметр suffix

Примеры

Пример #1 Пример использования функции 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("/");
?>

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

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

Примечания

Замечание:

basename() наивно оперирует исключительно исходной строкой и не учитывает реальную файловую систему или компоненты пути типа "..".

Замечание:

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

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

  • dirname() - Возвращает имя родительского каталога из указанного пути
  • pathinfo() - Возвращает информацию о пути к файлу

Коментарии

An faster alternative to:

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

would be:

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

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

<?php
substr
($fpathstrrpos($fpath'.') + 1); // returns the ext only
?>
2003-10-16 01:22:13
http://php5.kiev.ua/manual/ru/function.basename.html
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])
?>
2003-11-28 04:33:45
http://php5.kiev.ua/manual/ru/function.basename.html
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   
?>
2005-01-29 18:24:16
http://php5.kiev.ua/manual/ru/function.basename.html
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>');
?>
2005-01-30 08:18:28
http://php5.kiev.ua/manual/ru/function.basename.html
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
$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.
2005-07-13 14:43:52
http://php5.kiev.ua/manual/ru/function.basename.html
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);
        }
}
?>
2005-07-14 04:55:55
http://php5.kiev.ua/manual/ru/function.basename.html
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
2005-09-22 15:38:51
http://php5.kiev.ua/manual/ru/function.basename.html
Автор:
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!
2005-10-24 15:47:04
http://php5.kiev.ua/manual/ru/function.basename.html
Автор:
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").
2005-11-02 02:44:39
http://php5.kiev.ua/manual/ru/function.basename.html
Автор:
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.
2005-11-15 06:57:08
http://php5.kiev.ua/manual/ru/function.basename.html
Автор:
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];
?>
2006-02-17 18:19:19
http://php5.kiev.ua/manual/ru/function.basename.html
Basename without query string:

<?php
$filename   
array_shift(explode('?'basename($url_path)));
?>
2007-01-30 07:45:35
http://php5.kiev.ua/manual/ru/function.basename.html
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)
2007-04-11 07:33:50
http://php5.kiev.ua/manual/ru/function.basename.html
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.
2007-12-20 02:33:43
http://php5.kiev.ua/manual/ru/function.basename.html
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($filename0$pos);
       
$extension substr($filename$pos+1);
        return array(
$basename$extension);
    }
}
?>
2008-08-15 11:44:12
http://php5.kiev.ua/manual/ru/function.basename.html
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
2008-08-27 11:20:20
http://php5.kiev.ua/manual/ru/function.basename.html
It might be useful to have a version of the function basename working with arrays too.

<?php
function a_basename$file$exts )
{
   
$onlyfilename endexplode"/"$file ) );

    if( 
is_string$exts ) )
    {
        if ( 
strpos$onlyfilename$exts) !== 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 ;
}
?>
2008-09-08 04:34:46
http://php5.kiev.ua/manual/ru/function.basename.html
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.
2008-09-18 11:13:51
http://php5.kiev.ua/manual/ru/function.basename.html
Автор:
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'

?>
2009-10-12 18:43:36
http://php5.kiev.ua/manual/ru/function.basename.html
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;
}
2013-04-19 07:58:47
http://php5.kiev.ua/manual/ru/function.basename.html
If you want to get the extension of a file, I posted a function in http://softontherocks.blogspot.com/2013/07/obtener-la-extension-de-un-fichero-con.html

The function is:

 function getExtension($file) {
  $pos = strrpos($file, '.');
  return substr($file, $pos+1);
 }
2014-10-31 20:38:25
http://php5.kiev.ua/manual/ru/function.basename.html
@softontherocks at gmail dot com
> If you want to get the extension of a file, I posted a function in
> http://softontherocks.blogspot.com/2013/07/obtener-la-extension-de-un-fichero-con.html

> The function is:

> function getExtension($file) {
>   $pos = strrpos($file, '.');
>   return substr($file, $pos+1);
> }

This is much simpler:
$ext = strrchr( $filename, '.' );
2014-11-21 18:32:16
http://php5.kiev.ua/manual/ru/function.basename.html
@ lcvalentine at gmail dot com
>This is much simpler:
>$ext = strrchr( $filename, '.' );

Even though yours is shorter, you can also do:

$ext = end(explode(".", basename($file
2014-11-22 02:42:02
http://php5.kiev.ua/manual/ru/function.basename.html
Автор:
As already pointed out above, if a query string contains a '/' character, basename will not handle it well. But it can come really handy when you want to pass a url with query string to a funtion that copies/downloads the file using basename as local filename, by attaching  an extra query to the end of the url:

<?php
  $url 
'http://example.com/url?with=query_string';
 
basename($url); // url?with=query_string
 
$url $url '&filename_for_basename=/desired_filename.ext';
 
basename($url); // desired_filename.ext
?>

Note: you can use the filename from the HTTP header (if present) to get the file with it's original filename.
2014-12-15 16:30:57
http://php5.kiev.ua/manual/ru/function.basename.html
My opinion is, remove the $suffix first, and then apply splitting the core basename ( PHP 4 ):

/*
 * From stephane.fidanza@gmail.com:
 *
 * PHP 4: $suffix is removed first, and then the core basename is applied.
 * PHP 5: $suffix is removed after applying the core basename.
 *
 * (c) Paulus Gandung Prakosa (rvn.plvhx@gmail.com)
 */
if ( !function_exists('php4_backward_compat_basename') )
{
        function php4_backward_compat_basename($path, $suffix = '')
        {
                if ( $suffix !== '' ) {
                        $fixed_path = substr($path, 0, strlen($path) - strlen($suffix));
                        $fixed_basename = explode('/', $fixed_path);
                }

                return ( isset($fixed_basename) ? array_pop($fixed_basename) : array_pop(explode('/', $path)) );
        }
}
2017-02-21 01:49:56
http://php5.kiev.ua/manual/ru/function.basename.html
Автор:
There is a problem reading non-Latin characters in the file name if the locale is not configured correctly.
For example: instead of the name «ФЫВА-1234.doc», is displayed «-1234.doc».
Solution: rawurldecode(basename($full_name)).
2017-03-10 10:05:27
http://php5.kiev.ua/manual/ru/function.basename.html
Автор:
Try Long Path Tool as it can remove any problems that you might have.
2017-03-31 13:22:36
http://php5.kiev.ua/manual/ru/function.basename.html
Автор:
It's a shame, that for a 20 years of development we don't have mb_basename() yet!

// works both in windows and unix
function mb_basename($path) {
    if (preg_match('@^.*[\\\\/]([^\\\\/]+)$@s', $path, $matches)) {
        return $matches[1];
    } else if (preg_match('@^([^\\\\/]+)$@s', $path, $matches)) {
        return $matches[1];
    }
    return '';
}
2017-07-20 20:04:25
http://php5.kiev.ua/manual/ru/function.basename.html
the best way to get the filename from url is here
<?php 
     
// url : http://php.net/manual/add-note.php

       
defined('baseUrlFileName') or define('baseUrlFileName'
       
explode('.',explode('/',$_SERVER['PHP_SELF'])[3])[0]);

     echo 
baseUrlFileName // result 1

?>

Result 1 :
    add-note
2017-09-11 16:49:06
http://php5.kiev.ua/manual/ru/function.basename.html
Additional note to Anonymous's mb_basename() solution: get rid of trailing slashes/backslashes!

<?php
function mb_basename($path) {
    if (
preg_match('@^.*[\\\\/]([^\\\\/]+)([\\\\/]+)?$@s'$path$matches)) {
        return 
$matches[1];
    } else if (
preg_match('@^([^\\\\/]+)([\\\\/]+)?$@s'$path$matches)) {
        return 
$matches[1];
    }
    return 
'';
}

echo 
mb_basename("/etc//"); # "etc"
?>
2019-04-10 14:02:41
http://php5.kiev.ua/manual/ru/function.basename.html
One line alternative for unicode filenames:
<?php

preg_replace
('#.*?([^'.DIRECTORY_SEPARATOR.']*)'.DIRECTORY_SEPARATOR.'*$#''$1'$path);
2023-04-12 21:07:47
http://php5.kiev.ua/manual/ru/function.basename.html

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