PHP - 从文件名字符串中去除扩展名

10

我想从文件名中取出扩展名并获取文件名 - 比如 file.xml -> file, image.jpeg -> image, test.march.txt -> test.march 等等。

于是我写了这个函数:

function strip_extension($filename) {
   $dotpos = strrpos($filename, ".");
   if ($dotpos === false) {
      $result = $filename;
   }
   else {
      $result = substr($filename,0,$dotpos);
   }
   return $result;
}

这会返回一个空字符串。

我看不出我做错了什么?


你没有做错任何事情。这个函数是正常工作的(我刚刚进行了复制粘贴测试)。因此,你没有向我们展示的代码中有问题。当然,其他答案在某种意义上更好,但你问的是你做错了什么。顺便说一句,我会写function strip_extension(string $filename) : string { - Adam Chalcraft
6个回答

23

我认为您正在寻找pathinfo。引用手册内容:

<?php
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');

echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // since PHP 5.2.0
?>

结果:

/www/htdocs/inc
lib.inc.php
php
lib.inc

节省自己的时间,使用已经构建好的函数。 ;-)


你比我快了35秒 :P - ggutenberg
2
问题是,原帖作者只有文件的名称,而没有完整的文件路径。 - Clement Herreman
@dosboy: :吹掉手指并重新插回到腰旁: ;-) - Brad Christie
哎呀,我被忍者抢先了,但我有自己的例子 :) - Robik
1
我的错,我以为 pathinfo() 只能用于有效的路径/文件。Owned :x - Clement Herreman

8
你应该使用专门用于此的pathinfo函数。 示例: 所使用的工具:pathinfo()函数。
$name = 'file.php';

$pathInfo = pathinfo($name);

echo 'Name: '. $pathInfo['filename'];

结果:

Name: file

例子2(更短)

$name = 'file.php';    
$fileName= pathinfo($name, PATHINFO_FILENAME );

echo "Name: {$fileName}";

结果:

Name: file

实例展示: 示例1 | 示例2

这里提供两个实例供参考。

谢谢您,这个例子2拯救了我们。 - wordman

1
这个非常简单的函数就可以解决问题:
function strip_extension($filename)
{
    $extension = pathinfo($filename, PATHINFO_EXTENSION);
    $regexp = '@\.'.$extension.'$@';
    return preg_replace($regexp, "", $filename);
}

你转义了转义字符?那是必要的吗? - alex

1
这是一个简短的例子。只要知道如果你传递一个路径,你将丢失路径信息 :)
function stripExtension($filename) {
   return basename($filename, '.' . pathinfo($filename, PATHINFO_EXTENSION));
}

CodePad

这个的唯一优势是如果你正在运行 < PHP 5.2。


0

可能不是最高效的方法,但它确实回答了问题。

function strip_extension($filename){
    $f = array_reverse(str_split($filename));
    $e = array();
    foreach($f as $p){
        if($p == '.'){
            break;
        }else{
            array_push($e,$p);
        }
    }
    return implode('',array_reverse($e));
}

0
function strip_extension($filename){
  if (isset(pathinfo($filename)['extension'])) { // if have ext
    return substr($filename, 0, - (strlen(pathinfo($filename)['extension'] +1)));
  }
  return $filename;  // if not have ext
}

您必须验证文件名是否具有扩展名,以避免在使用pathinfo函数时出现错误。如http://php.net/manual/en/function.pathinfo.php所述。


你可以直接使用 pathinfo($filename, PATHINFO_EXTENSION) 来获取一个字符串,而不需要在数组上调用 isset()。 - Anther

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接