basename

(PHP 4, PHP 5, PHP 7, PHP 8)

basename返回路径的尾部名称组件

描述

basename(string $path, string $suffix = ""): string

给定一个包含文件或目录路径的字符串,此函数将返回尾部名称组件。

注意:

basename() 对输入字符串进行简单操作,它不知道实际的文件系统或路径组件,例如 ".."。

警告

basename() 依赖于区域设置,因此为了让它在多字节字符路径中看到正确的基名,必须使用 setlocale() 函数设置匹配的区域设置。如果 path 包含对当前区域设置无效的字符,则 basename() 的行为未定义。

参数

path

路径。

在 Windows 上,斜杠 (/) 和反斜杠 (\) 都用作目录分隔符。在其他环境中,它是正斜杠 (/)。

suffix

如果名称组件以 suffix 结尾,那么它也会被截断。

返回值

返回给定 path 的基本名称。

示例

示例 #1 basename() 示例

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

上面的例子将输出

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

参见

添加注释

用户贡献的笔记 31 个笔记

48
匿名
7 年前
令人遗憾的是,在 20 年的开发中,我们还没有 mb_basename()!

// 在 Windows 和 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 '';
}
36
stephane dot fidanza at gmail dot com
17 年前
$suffix 参数的支持在 PHP4 和 PHP5 之间发生了变化
在 PHP4 中,$suffix 首先被移除,然后应用核心基名。
相反,在 PHP5 中,$suffix 在应用核心基名后被移除。

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

PHP4 中的结果:file
PHP5 中的结果:Texture)
7
zandor_zz at yahoo dot it
15 年前
可能有用的是有一个适用于数组的 basename 函数版本。

<?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 ) )
{
// 对 PHP 版本 <= 5.x.x 有效
foreach( $exts as $KEY => $ext )
{
$onlyfilename = str_replace( $ext, "", $onlyfilename );
}
}

return
$onlyfilename ;
}
?>
10
(remove) dot nasretdinov at (remove) dot gmail dot com
15 年前
在我的情况下,只有一个变体对我的俄语 UTF-8 字母有效

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

它是针对 UNIX 服务器的
4
KOmaSHOOTER at gmx dot de
19 年前
如果你想要文件所在的当前路径而不是完整的路径,那么使用这个 :)

<?php
echo('dir = '.basename (dirname($_SERVER['PHP_SELF']),"/"));
// 返回当前使用的目录名称
?>

示例

www 目录:domain.com/temp/2005/january/t1.php

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

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

如果你将这两个组合在一起,你会得到这个
<?php
echo('dir = '.basename (dirname($_SERVER['PHP_SELF']),"/"));
// 返回:january
?>

要获取完整路径,请使用以下代码
<?php
echo(' PHP_SELF <br>'.$_SERVER['PHP_SELF'].'<br><br>');
// 返回:/temp/2005/january/t1.php
?>
5
瑞典男孩
14 年前
以下是一种快速获取文件名(不含扩展名)的方法,无论文件后缀是什么。

<?php

// 您的文件
$file = 'image.jpg';

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

echo
$file_name; // 输出 'image'

?>
2
KOmaSHOOTER 在 gmx.de
20 年前
文件名拆分示例

<?php
echo(basename ($PHP_SELF)."<br>"); // 返回 filename.php
$file = basename ($PHP_SELF);
$file = explode(".",$file);
print_r($file); // 返回 Array ( [0] => filename [1] => php )
echo("<br>");
$filename = basename(strval($file[0]),$file[1]);
echo(
$filename."<br>"); // 返回 filename
echo(basename ($PHP_SELF,".php")."<br>"); // 返回 filename
echo("<br>");
$filename = basename($PHP_SELF,".php");
echo("<br>");
//show_source(basename ($PHP_SELF,".php").".php")
show_source($file[0].".".$file[1])
?>
3
懒惰的莱斯特
18 年前
如果您的路径包含附加的查询字符串,并且查询字符串包含 "/" 字符,那么下面提供的用于提取文件名的建议将不起作用。

例如,如果路径是这样的
http://www.ex.com/getdat.php?dep=n/a&title=boss

那么 php basename() 函数以及
$_SERVER[QUERY_STRING] 变量都会感到困惑。

在这种情况下,请使用

<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];
?>
0
[email protected]
15 年前
我从这段代码中得到了空白输出

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

之前一位朋友在这里建议。

所以任何想要获取当前目录路径的人都可以使用我使用的另一种技术,例如

// 假设您在 pageitself.php 页面中使用它

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

希望对您有所帮助。
0
[email protected]
19 年前
在 *nix 服务器上使用此函数时,存在一个实际问题,因为它不处理 Windows 路径(使用 \ 作为分隔符)。为什么这会在 *nix 服务器上成为问题?如果您需要处理来自 MS IE 的文件上传怎么办?事实上,手册部分“处理文件上传”在示例中使用了 basename(),但这 *不会* 从 Windows 路径(例如 C:\My Documents\My Name\filename.ext)中提取文件名。经过多次沮丧的编码,以下是我的处理方式(可能不是最好的,但它有效)

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

现在 $newfile 将只包含文件名和扩展名,即使 POST 的文件名包含完整的 Windows 路径。
-2
匿名
7 年前
如果区域设置配置不正确,在读取文件名中的非拉丁字符时会出现问题。
例如:显示的不是“ФЫВА-1234.doc”而是“-1234.doc”。
解决方法:rawurldecode(basename($full_name))。
-1
[email protected]
5 年前
关于 Anonymous 的 mb_basename() 解决方案的补充说明:去掉尾部的斜杠/反斜杠!

<?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"
?>
-4
[email protected]
18 年前
返回当前目录的简单方法
$cur_dir = basename(dirname($_SERVER[PHP_SELF]))

因为 basename 始终将路径视为文件路径,例如

/var/www/site/foo/ 指示 /var/www/site 作为文件路径
foo
-4
[email protected]
15 年前
从完整路径中提取基本名称后,如果要将扩展名与文件名分开,以下函数可以有效地完成此操作

<?php
function splitFilename($filename)
{
$pos = strrpos($filename, '.');
if (
$pos === false)
{
// 在文件名中找不到点
return array($filename, ''); // 没有扩展名
}
else
{
$basename = substr($filename, 0, $pos);
$extension = substr($filename, $pos+1);
return array(
$basename, $extension);
}
}
?>
-4
穆罕默德·艾尔-赛义德 [email protected]
11 年前
获取我网站的基本 URL

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;
}
-6
[email protected]
16 年前
在 Windows 系统上,文件名不区分大小写。如果您必须确保在将应用程序移植到 Unix 系统时使用正确的大小写,可以使用以下组合

<?php
// 假设真实文件名是 mytest.JPG:

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

basename 本身不会检查文件系统的给定文件,它会这样做,所以看起来,它只进行字符串操作。
使用 realpath() 可以“扩展”此功能。
-1
[email protected]
1 年前
用于 unicode 文件名的单行替代方案
<?php

preg_replace
('#.*?([^'.DIRECTORY_SEPARATOR.']*)'.DIRECTORY_SEPARATOR.'*$#', '$1', $path);
-6
[email protected]
9 年前
@softontherocks at gmail dot com
> 如果你想获取文件的扩展名,我在
> http://softontherocks.blogspot.com/2013/07/obtener-la-extension-de-un-fichero-con.html
>
> 发布了一个函数
>
> function getExtension($file) {
> $pos = strrpos($file, '.');
> return substr($file, $pos+1);
> }

这更简单
$ext = strrchr( $filename, '.' );
-5
poop at poop dot com
9 年前
@ lcvalentine at gmail dot com
>这更简单
>$ext = strrchr( $filename, '.' );

即使你的更短,你也可以这样做

$ext = end(explode(".", basename($file
-4
amitabh at NOSPAM dot saysnetsoft dot com
19 年前
"pvollma" 发布的先前示例对我不起作用,因此我稍微修改了一下
<?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);
}
}
?>
-6
icewind
18 年前
由于 filename() 获取 "file.php?var=foo",我使用 explode 以及 basename,如下所示

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

现在 $file 仅包含 "file.php",而 $query 包含查询字符串(在本例中为 "var=foo")。
-9
thoughts at highermind dot org
17 年前
没有查询字符串的基名

<?php
$filename
= array_shift(explode('?', basename($url_path)));
?>
-5
Anonymous
9 年前
如上所述,如果查询字符串包含 "/" 字符,basename 无法很好地处理它。但是,当您想将带查询字符串的 URL 传递给使用 basename 作为本地文件名的复制/下载文件的函数时,它会非常有用,方法是在 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
?>

注意:您可以使用 HTTP 标头中的文件名(如果存在)来获取带有其原始文件名的文件。
-8
www.turigeza.com
18 年前
简单,但以上示例中没有提到

echo basename('somewhere.com/filename.php?id=2', '.php');
将输出
filename.php?id=2

如果您期望的文件名不是这样!
-4
gandung at ppp dot cylab dot cmu dot edu
7 年前
我的观点是,先删除 $suffix,然后对核心基名进行拆分(PHP 4)

/*
* 来自 [email protected]
*
* PHP 4:先删除 $suffix,然后应用核心基名。
* PHP 5:在应用核心基名后删除 $suffix。
*
* (c) Paulus Gandung Prakosa ([email protected])
*/
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)) );
}
}
-7
Anonymous
18 年前
icewinds 的示例不起作用,查询部分将包含文件名的第二个字符,而不是 URL 的查询部分。
<?
$file = "path/file.php?var=foo";
$file = explode("?", basename($file));
$query = $file[1];
$file = $file[0];
?>

这样更好。
-6
daijoubu_NOSP at M_videotron dot ca
20 年前
一个比以下代码更快的替代方法

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



<?php
substr
($fpath, strrpos($fpath, '.')); // 返回点
?>

如果您不需要点,只需将位置加 1 即可

<?php
substr
($fpath, strrpos($fpath, '.') + 1); // 仅返回扩展名
?>
-9
softontherocks at gmail dot com
9 年前
如果你想获取文件的扩展名,我在 http://softontherocks.blogspot.com/2013/07/obtener-la-extension-de-un-fichero-con.html 发布了一个函数

函数是

function getExtension($file) {
$pos = strrpos($file, '.');
return substr($file, $pos+1);
}
-8
wibgates dot kenneth at gmail dot com
6 年前
从 URL 获取文件名的最佳方法如下所示
<?php
// url : https://php.net/manual/add-note.php

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

echo
baseUrlFileName ; // 结果 1

?>

结果 1
add-note
-13
KOmaSHOOTER at gmx dot de
19 年前
如果你想要父目录的名称
<?php
$_parenDir_path
= join(array_slice(split( "/" ,dirname($_SERVER['PHP_SELF'])),0,-1),"/").'/'; // 返回父目录的完整路径
$_parenDir = basename ($_parenDir_path,"/"); // 仅返回父目录的名称
// 或
$_parenDir2 = array_pop(array_slice(split( "/" ,dirname($_SERVER['PHP_SELF'])),0,-1)); // 也仅返回父目录的名称
echo('$_parenDir_path = '.$_parenDir_path.'<br>');
echo(
'$_parenDir = '.$_parenDir.'<br>');
echo(
'$_parenDir2 = '.$_parenDir2.'<br>');
?>
-19
frank1982
7 年前
尝试使用 Long Path Tool,因为它可以解决您可能遇到的任何问题。
To Top