PHP,获取不带文件扩展名的文件名
我有以下PHP代码:PHP,获取不带文件扩展名的文件名,php,file,string,Php,File,String,我有以下PHP代码: function ShowFileExtension($filepath) { preg_match('/[^?]*/', $filepath, $matches); $string = $matches[0]; $pattern = preg_split('/\./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE); if(count($pattern) > 1) { $f
function ShowFileExtension($filepath)
{
preg_match('/[^?]*/', $filepath, $matches);
$string = $matches[0];
$pattern = preg_split('/\./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE);
if(count($pattern) > 1)
{
$filenamepart = $pattern[count($pattern)-1][0];
preg_match('/[^?]*/', $filenamepart, $matches);
return strtolower($matches[0]);
}
}
如果我有一个名为my.zip
的文件,此函数将返回.zip
我想要做相反的事情,我想要函数返回my
,不带扩展名
文件只是变量中的一个字符串。不需要所有这些。检查出来,它给你所有的组成部分,你的路径 手册中的示例:
$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"; // filename is only since PHP 5.2.0
代码的输出:
/www/htdocs
index.html
html
index
或者,您只能获得某些部分,如:
echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html
作为替代,您可以使用
- -返回路径的文件名组件
$path = "/home/httpd/html/index.php";
$file = basename($path); // $file is set to "index.php"
$file = basename($path, ".php"); // $file is set to "index"
不过,您必须知道扩展名才能提前删除它
但是,由于您的问题表明您需要获取扩展名和basename,我认为这是最有用的扩展名,因为它可以通过一个本机函数为您提供有关路径和文件的任何信息。@Gordon basename如果您知道扩展名就可以了,如果您不知道,您可以使用explode:
$filename = end(explode(".", $file));
@如果文件名使用点,则可能会得到错误的输出。 我会使用@Gordon方法,但也会获得扩展,因此basename函数适用于所有扩展,如下所示:
$path = "/home/httpd/html/index.php";
$ext = pathinfo($path, PATHINFO_EXTENSION);
$file = basename($path, ".".$ext); // $file is set to "index"
简单功能测试:另一种方法是使用正则表达式
$fileName = basename($filePath);
$fileNameNoExtension = preg_replace("/\.[^.]+$/", "", $fileName);
这将从最后一个句点
一直删除到字符串末尾。如果您不知道文件扩展名,则删除不带文件扩展名的文件名:
$basename=substr($filename,0,strrpos($filename,“.”)代码>此文件名仅返回一行,不带任何扩展名:
$path = "/etc/sudoers.php";
print array_shift(explode(".", basename($path)));
// will print "sudoers"
$file = "file_name.php";
print array_shift(explode(".", basename($file)));
// will print "file_name"
如果扩展名未知,请使用此解决方案
pathinfo('D:/dir1/dir2/fname', PATHINFO_FILENAME); // return "fname"
pathinfo('D:/dir1/dir2/fname.php', PATHINFO_FILENAME); // return "fname"
pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "fname"
pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_DIRNAME) . '/' . pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "D:/dir1/dir2/fname"
如果您不知道您有哪个分机,那么您可以尝试以下方法:
$ext = strtolower(substr('yourFileName.ext', strrpos('yourFileName.ext', '.') + 1));
echo basename('yourFileName.ext','.'.$ext); // output: "youFileName" only
处理所有可能的问题:
image.jpg // output: "image"
filename.image.png // output: "filename.image"
index.php // output: "index"
在我的情况下,我使用下面的。我不在乎它的外延是什么D
我想这会对你有帮助
$exploded_filepath = explode(".", $filepath_or_URL);
$extension = end($exploded_filepath);
echo basename($filepath_or_URL, ".".$extension ); //will print out the the name without extension.
你可以写这个
$filename = current(explode(".", $file));
如果以前未使用,这些将返回数组的当前元素。Short
echo pathinfo(__FILE__)['filename']; // since php 5.2
您的答案低于在php中隐藏文件扩展名的完美解决方案
<?php
$path = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
echo basename($path, ".php");
?>
几乎所有上述解决方案都显示了从变量$path获取文件名
下面的代码段将获取当前执行的文件名,不带扩展名
echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME);
解释
echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME);
$\u服务器['SCRIPT\u NAME']包含当前脚本的路径
不需要编写大量代码。甚至只需一行代码就可以完成。看
以下是仅返回文件名并删除扩展名的单行代码:
<?php
echo pathinfo('logo.png')['filename'];
?>
来源:当一个扩展有多个部分时,现有的解决方案会失败。以下函数适用于多个部分、完整路径或文件名:
function removeExt($path)
{
$basename = basename($path);
return strpos($basename, '.') === false ? $path : substr($path, 0, - strlen($basename) + strlen(explode('.', $basename)[0]));
}
echo removeExt('https://example.com/file.php');
// https://example.com/file
echo removeExt('https://example.com/file.tar.gz');
// https://example.com/file
echo removeExt('file.tar.gz');
// file
echo removeExt('file');
// file
为什么会被否决?答案绝对正确。pathinfo对字符串进行操作,因此文件是否确实在服务器上并不重要。不幸的是,他们错误地命名了“basename”,因为它返回的是带扩展名的完整文件名,而不是基名称。@Oscar这是术语basename
最为广泛理解的含义。没有错误命名。这是非常有用的,特别是当你不需要知道文件扩展名来提取它时。这是一个非常优雅的解决方案。荣誉这应该被标记为正确答案。请使用我答案下面的评论功能直接向我发表评论。最合适的函数是pathinfo
,这就是为什么我只提供了basename
作为替代。没有必要用regex或explode重新创建pathinfo
,您的更新毫无意义<代码>结束(分解(“.”,$file))代码>为您提供扩展名,而不是文件名。这将返回带有extension@user966939Mhh,没有扩展名是basename
;-)好吧,不管怎样,他都在要求一个没有扩展的解决方案@用户966939,伙计,根本没有分机。这是PATHINFO\u FILENAME
,而不是PATHINFO\u EXTENSION
…谁决定FILENAME
没有扩展名,而basename
有扩展名,肯定有一些虐待狂倾向…我喜欢这个答案,非常简单,在你不知道扩展名的情况下也能起作用。比使用explode要好得多,如果您在文件名中使用句点,则只捕获最后一个句点部分。不,这要糟糕得多。别再给人打电话了。谢谢,上面的评论很好。不必知道扩展名,这会更有用。@caiosm1005,攻击面会立即增加,因为很难对正则表达式引擎的内部进行推理。例如,在上面的代码中,如果有一些输入$fileName
可能导致引擎以指数(或更差)时间运行,这并不奇怪。假设我们已经完成了对这个特定正则表达式引擎内部的剖析,并且从理论上证明了它对所有可能的值都是健壮的$fileName
,代码仍然不能任意移植到另一个平台,该平台具有另一个regex引擎实现。如果扩展名类似于.tar.gz,如何?请为pathinfo
提供一个类似于php手册页的扩展名。这将有助于OP改进ShowFileExtension
方法,并为试图找到此答案的任何人提供额外的阅读。另外,一点描述也不会误入歧途……我已经用同样的解决方案回答了这个问题,~比你早了2年;)@yckart是正确的,但这确实在答案中给出了多个示例。你的网站有链接到ideone.com的好处,但网站可能会离线。顺便说一句:$extension
你好,请在降级之前检查一下。我已经在我的代码中使用过很多次了。通过使用此函数,如果文件名为“xyz.jpg”,则只需获得一个文件名。它可能不适用于包含整个路径的文件名
function removeExt($path)
{
$basename = basename($path);
return strpos($basename, '.') === false ? $path : substr($path, 0, - strlen($basename) + strlen(explode('.', $basename)[0]));
}
echo removeExt('https://example.com/file.php');
// https://example.com/file
echo removeExt('https://example.com/file.tar.gz');
// https://example.com/file
echo removeExt('file.tar.gz');
// file
echo removeExt('file');
// file