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


135

我正在寻找一个小的功能,该功能允许我从文件名中删除扩展名。

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

看这些脚本,

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

要么

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

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

这是字符串的例子

它将仅返回“ This” ...

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

如何做呢?


1
什么是“真实”扩展名?您是否要删除最后的4个或les字符(如果它们以点开头)?
clyfe

“ Col. Shrapnel”-专为Windows用户设计。“ clyfe”-是的,我想删除点后的所有内容,但仅当它位于4或5位置时,代表“ .jpeg”或“ .mp3”的内容。我只是不想删除它。我知道我可以使用str-pos手动完成操作,并使用if语句剪切字符串(如果5 pos =点,然后从正确的5个字符中剪切(rtrim),如果4 pos =点,然后rtrim 4,否则返回而无需进行任何修改。但是也许是更快的解决方案
马克

3
.package文件呢?还是.unity?将扩展名限制为4个字符似乎有些武断。
rdb

Answers:


172

试试这个:

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

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


问题是,还有人重命名文件,例如:20120720.something.somethingelse.jpg
Obmerk Kronen

3
我认为这不适用于以两个字符为扩展名的文件
NaturalBornCamper 2012年

1
ty!请注意,如果您不执行变量替换,则应使用单引号,例如"$var"
aelgoa 2013年

好吧,要与.py文件一起使用,我想您必须添加2,3,4而不是仅添加3,4:>谢谢!
voghDev 2014年

2
@voghDev支持使用2到4个字符的扩展名,{2,4}而不是{3,4}
Timo


81

在手册中,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


我已经检查过了。与上述相同的错误。尝试从T.sec访问“ $ path_parts ['文件名”]-“ xxx” 23 12 32 3 a twym2它只会返回T。在上面的示例中,它不应删除任何内容!
马克·


35

这是一个非常简单的解决方案,无论扩展名有多长,字符串中有多少个点或其他字符都可以使用。

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

基本上,这只是寻找的最后一次出现。然后使用子字符串检索到该点为止的所有字符。

它与您的Google示例之一相似,但是比正则表达式和其他示例更简单,更快,更容易。好吧,imo。希望它能帮助某人。


2
我知道这来不及了,但是我认为这是最好的答案。效果很好。
Agbogidi Michael

例如,对于没有扩展名的* nix隐藏文件,这将不起作用.htaccess
Fr0zenFyr

12

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

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

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

./somefile

在CodePad.org上查看

或使用正则表达式...

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

在CodePad.org上查看

如果您没有路径,而只有文件名,那么它将起作用并且更加麻烦...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

在CodePad.org上查看

当然,它们都只是寻找最后一个句号(.)。


如解决方案的最后一行所述,它对于诸如.htaccess
Fr0zenFyr '19

8

以下代码对我来说效果很好,而且很短。它将文件分解成一个由点分隔的数组,删除最后一个元素(假设是扩展名),然后再次用点重新构成该数组。

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

如果文件没有扩展将返回false或清空如果文件是.htaccess
蒂莫Huovinen

5

我在Google上找到了很多示例,但它们很糟糕,因为仅用“。”删除字符串的一部分。

实际上,这绝对是正确的做法。继续使用。

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


2
.. .htaccess并且不要忘记.htpasswd在Apache环境中。
h2ooooooo 2013年

5

推荐使用: pathinfo 搭配 PATHINFO_FILENAME

$filename = 'abc_123_filename.html';
$without_extension = pathinfo($filename, PATHINFO_FILENAME);

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文件中,包含不带扩展名的文件名


4
$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

1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);添加它以获取文件扩展名。
I_ATE_YOUR_WORK_FILES

2

正如其他人提到的那样,将扩展限制为一定数量的字符的想法是无效的。遵循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


1

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

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


0

用这个:

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

仅在文件名还没有句点的情况下才有效。PHP文件提针的第一次出现
relipse

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'

你可以此减少到一个符合array_pop()
彼得品牌

0

编辑:最聪明的方法恕我直言,它从文件名(又名扩展名)中删除最后一点和后面的文本

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

干杯;)


尽管它可以工作,但end()不应该与作为参数传递的函数一起工作。它还会发出通知:只有变量才能通过引用传递
CodeBrauer18年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.