PHP,获取没有文件扩展名的文件名

Mos*_*ady 185 php string file

我有这个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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我有一个名为的文件my.zip,则此函数返回.zip.

我想反过来,我希望函数在my没有扩展名的情况下返回.

该文件只是变量中的一个字符串.

小智 356

不需要这一切.检查pathinfo(),它为您提供路径的所有组件.

手册中的示例:

$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
Run Code Online (Sandbox Code Playgroud)

输出代码:

/www/htdocs
index.html
html
index
Run Code Online (Sandbox Code Playgroud)

或者你只能获得某些部分,如:

echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,他们错误地命名为"basename",因为它返回带有扩展名的完整文件名,而不是基本名称. (12认同)
  • 为什么这会被贬低?答案绝对正确.pathinfo对字符串进行操作,因此文件是否实际位于服务器上并不重要. (3认同)
  • @Oscar 这是“basename”一词最广为人知的含义。没有错名。 (2认同)

Gor*_*don 191

作为替代方案pathinfo(),您可以使用

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"
Run Code Online (Sandbox Code Playgroud)

你必须提前知道扩展名才能删除它.

但是,由于您的问题表明您需要获取扩展名基本名称,我将Pekka的答案视为最有用的答案,因为它会为您提供有关路径和文件的任何信息,只需一个本机功能.


yck*_*art 62

https://php.net/manual/en/function.pathinfo.php

pathinfo($path, PATHINFO_FILENAME);
Run Code Online (Sandbox Code Playgroud)

简单的功能测试:https://ideone.com/POhIDC

  • 谁决定`filename`没有扩展名而`basename`确实必须有一些虐待倾向... (18认同)
  • @ user966939 Mhh,没有**和**扩展名是`basename` ;-) (2认同)
  • @ user966939,Dude根本没有扩展名.这是'PATHINFO_FILENAME`,而不是'PATHINFO_EXTENSION` .... (2认同)

cai*_*005 12

另一种方法是使用正则表达式.

$fileName = basename($filePath);
$fileNameNoExtension = preg_replace("/\.[^.]+$/", "", $fileName);
Run Code Online (Sandbox Code Playgroud)

这将从上一个句点中删除,.直到字符串结束.

  • **不**,情况要糟糕得多.别再兴奋了. (6认同)

any*_*asa 12

如果未知扩展名,请使用此解决方案

 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"
Run Code Online (Sandbox Code Playgroud)

PHP MAN功能路径信息


fir*_*ire 7

如果您知道扩展名,@ Gordon basename将正常工作,如果您不能使用explode:

$filename = end(explode(".", $file));
Run Code Online (Sandbox Code Playgroud)

  • 如果文件像my.file.2.1.zip,它将无法工作 (30认同)
  • @fire,你的更新毫无意义.`end(explode(".",$ file));`给你扩展名,而不是文件名. (4认同)

Roh*_*ude 7

几乎所有上述解决方案都显示了从变量$ path获取文件名

片段下方将获取当前执行的文件名而不包含扩展名

echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME);
Run Code Online (Sandbox Code Playgroud)

说明

$ _SERVER ['SCRIPT_NAME']包含当前脚本的路径.


Far*_*ick 5

没有必要编写大量代码.即使它只能通过一行代码完成.看到这里

下面是仅返回文件名的一行代码,并删除扩展名:

<?php
 echo pathinfo('logo.png')['filename'];
?>
Run Code Online (Sandbox Code Playgroud)

它会打印出来

logo
Run Code Online (Sandbox Code Playgroud)

来源:删除扩展名并仅返回PHP中的文件名