Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP,获取不带文件扩展名的文件名_Php_File_String - Fatal编程技术网

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

我有以下PHP代码:

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
作为替代,您可以使用

  • -返回路径的文件名组件
PHP手册中的示例

$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