如何从字符串中删除扩展名(仅限实际扩展名!)

时间:2010-03-07 10:11:06

标签: php

我正在寻找一个允许我从文件名中删除扩展名的小函数。

我通过谷歌搜索发现了许多例子,但它们很糟糕,因为它们只是用“。”删除部分字符串。 。他们使用点作为限制器,只是剪切字符串。

看看这些脚本,

$from = preg_replace('/\.[^.]+$/','',$from);

 $from=substr($from, 0, (strlen ($from)) - (strlen (strrchr($filename,'.'))));

当我们添加这样的字符串时:

  

This.is somestring

的例子

它只返回“This”......

扩展名可以包含3个或4个字符,因此我们必须检查点是否位于4或5位置,然后将其删除。

怎么做?

18 个答案:

答案 0 :(得分:267)

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

$filename = pathinfo('filename.md.txt', PATHINFO_FILENAME); // returns 'filename.md'

答案 1 :(得分:157)

试试这个:

$withoutExt = preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename);

因此,这匹配一个点后跟三个或四个不是点或空格的字符。 “3或4”规则应该放宽,因为有大量文件扩展名更短或更长。

答案 2 :(得分:76)

从手册 pathinfo

<?php
    $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"; // Since PHP 5.2.0
?>

它不一定是完整的正常运作途径。它会像file.jpg一样愉快地解析/path/to/my/file.jpg

答案 3 :(得分:53)

使用PHP basename()

(PHP 4,PHP 5)

var_dump(basename('test.php', '.php'));

输出:string(4)“test”

答案 4 :(得分:31)

这是一个相当简单的解决方案,无论字符串中的扩展名或点数或其他字符有多长,它都能正常工作。

$filename = "abc.def.jpg";

$newFileName = substr($filename, 0 , (strrpos($filename, ".")));

//$newFileName will now be abc.def

基本上这只是寻找最后一次出现的。然后使用substring来检索到那一点的所有字符。

它类似于你的一个googled示例,但比正则表达式和其他示例更简单,更快速,更容易。好吧imo无论如何。希望它可以帮到某人。

答案 5 :(得分:11)

您可以使用PHP内置的功能来帮助...

$withoutExt = pathinfo($path, PATHINFO_DIRNAME) . '/' . pathinfo($path, PATHINFO_FILENAME);

虽然如果你只处理文件名(.somefile.jpg),你会得到......

  

./ somefile

See it on CodePad.org

或使用正则表达式...

$withoutExt = preg_replace('/\.' . preg_quote(pathinfo($path, PATHINFO_EXTENSION), '/') . '$/', '', $path);

See it on CodePad.org

如果你没有路径,只有一个文件名,那么这将有效并且更加轻松...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

See it on CodePad.org

当然,这些只是寻找最后一个时期(.)。

答案 6 :(得分:7)

以下代码适用于我,而且非常简短。它只是将文件分成由点分隔的数组,删除最后一个元素(假设是扩展名),并再次使用点重构数组。

$filebroken = explode( '.', $filename);
$extension = array_pop($filebroken);
$fileTypeless = implode('.', $filebroken);

答案 7 :(得分:5)

  

我在谷歌上发现了很多例子,但有些不好,因为只需用“。”删除部分字符串

实际上这绝对是正确的事情。继续使用它。

文件扩展名是最后一个点之后的所有内容,并且不要求文件扩展名为任何特定数量的字符。即使只谈论Windows,它已经附带了不适合3-4个字符的文件扩展名,例如。 .manifest

答案 8 :(得分:4)

有几种方法可以做到,但我认为其中一种更快捷的方法是以下

// $filename has the file name you have under the picture
$temp = explode( '.', $filename );
$ext = array_pop( $temp );
$name = implode( '.', $temp );

另一种解决方案就是这样。我还没有对它进行测试,但看起来它应该在文件名中的多个句点中起作用

$name = substr($filename, 0, (strlen ($filename)) - (strlen (strrchr($filename,'.'))));

此外:

$info = pathinfo( $filename );
$name = $info['filename'];
$ext  = $info['extension'];

// Or in PHP 5.4, i believe this should work
$name = pathinfo( $filename )[ 'filename' ];

在所有这些中,$name包含没有扩展名

的文件名

答案 9 :(得分:2)

$image_name = "this-is.file.name.jpg";
$last_dot_index = strrpos($image_name, ".");
$without_extention = substr($image_name, 0, $last_dot_index);

输出:

this-is.file.name

答案 10 :(得分:1)

您可以使用{x,y}运算符设置正则表达式模式的长度。如果前一个模式发生3或4次,{3,4}将匹配。

但我不认为你真的需要它。您将如何处理名为“This.is”的文件?

答案 11 :(得分:1)

正如其他人所提到的,限制扩展到一定数量的字符的想法是无效的。继续使用array_pop的想法,将分隔的字符串视为一个数组,这个函数对我有用......

function string_pop($string, $delimiter){
    $a = explode($delimiter, $string);
    array_pop($a);
    return implode($delimiter, $a);
}

用法:

$filename = "pic.of.my.house.jpeg";
$name = string_pop($filename, '.');
echo $name;

输出:

pic.of.my.house  (note it leaves valid, non-extension "." characters alone)

行动中:

http://sandbox.onlinephpfunctions.com/code/5d12a96ea548f696bd097e2986b22de7628314a0

答案 12 :(得分:0)

使用此:

strstr('filename.ext','.',true);
//result filename

答案 13 :(得分:0)

尝试使用这个。它肯定会删除文件扩展名。

$filename = "image.jpg";
$e = explode(".", $filename);
foreach($e as $key=>$d)
{
if($d!=end($e)
{

$new_d[]=$d; 
}

 }
 echo implode("-",$new_t);  // result would be just the 'image'

答案 14 :(得分:0)

修改: 最聪明的方法恕我直言,它从文件名(又名扩展名)中删除最后一点和后续文字

$name = basename($filename, '.' . end(explode('.', $filename)));

干杯;)

答案 15 :(得分:0)

当扩展包含多个部分且简短高效时,此方法有效:

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

答案 16 :(得分:0)

推荐使用: width=0dp pathinfo

PATHINFO_FILENAME

答案 17 :(得分:0)

此页着陆的目的是寻找一种最快方式,以从glob()结果中的数字文件名中删除扩展名。

因此,我进行了一些非常基本的基准测试,发现这是最快的方法。不到preg_replace()的一半时间:

$result = substr($fileName,0,-4);

现在我知道glob()中的所有文件都有一个.zip扩展名,所以我可以这样做。

如果文件扩展名未知且长度未知,则以下方法将起作用,但仍比preg_replace()快20%。也就是说,只要有扩展名即可。

$result = substr($fileName,0,strrpos($fileName,'.'));

基本基准测试代码和结果:

$start = microtime(true);

$loop = 10000000;
$fileName = 'a.LONG-filename_forTest.zip';
$result;

// 1.82sec preg_replace() unknown ext
//do {
//    $result = preg_replace('/\\.[^.\\s]{3,4}$/','',$fileName);
//} while(--$loop);

// 1.7sec preg_replace() known ext
//do {
//    $result = preg_replace('/.zip$/','',$fileName);
//} while(--$loop);

// 4.57sec! - pathinfo
//do {
//    $result = pathinfo($fileName,PATHINFO_FILENAME);
//} while(--$loop);

// 2.43sec explode and implode
//do {
//    $result = implode('.',explode('.',$fileName,-1));
//} while(--$loop);

// 3.74sec basename, known ext
//do {
//    $result = basename($fileName,'.zip');
//} while(--$loop);

// 1.45sec strpos unknown ext
//do {
//    $result = substr($fileName,0,strrpos($fileName,'.'));
//} while(--$loop);

// 0.73sec strpos - known ext length
do {
    $result = substr($fileName,0,-4);
} while(--$loop);

var_dump($fileName);
var_dump($result);
echo 'Time:['.(microtime(true) - $start).']';

exit;