如何从string中删除扩展名(只有真正的扩展名!)

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

我发现了很多使用googlesearch的例子,但是它们不好,因为它们只是用“。”来删除部分string。 。 他们使用点作为限制器,只是切割string。

看看这些脚本,

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

要么

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

当我们像这样添加string时:

这是somestring的例子

它只会返回“这个”…

扩展名可以有3个或4个字符,所以我们必须检查点是否在4或5的位置,然后删除它。

怎么办?

试试这个:

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

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

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

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

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

它不一定是一个完整的操作正确的path。 它将同样快乐地将file.jpgparsing为/path/to/my/file.jpg

使用PHP basename()

(PHP 4,PHP 5)

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

输出:string(4)“testing”

这是一个相当简单的解决scheme,无论延伸多久或string中有多less个点或其他字符,都可以工作。

 $filename = "abc.def.jpg"; $newFileName = substr($filename, 0 , (strrpos($filename, "."))); //$newFileName will now be abc.def 

基本上这只是寻找最后的发生。 然后使用子string检索到那个点的所有字符。

它和你的一个例子相似,但比正则expression式和其他例子更简单,更快速,更简单。 好吧,无论如何。 希望它可以帮助别人。

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

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

你可以使用PHP内置的协助…

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

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

./somefile

在CodePad.org上查看

或者使用正则expression式…

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

在CodePad.org上查看

如果你没有一个path,但只是一个文件名,这将工作,并且更加terser …

 $withoutExt = pathinfo($path, PATHINFO_FILENAME); 

在CodePad.org上查看

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

我在Google上发现了很多例子,但是不好,因为只是删除了部分string“。”

其实这绝对是正确的事情。 继续使用。

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

有几种方法可以做到这一点,但我认为更快的方法之一是以下几点

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

另一个解决办法是 我还没有testing过,但它看起来应该在一个文件名多个时期工作

 $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包含没有扩展$name的文件名

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

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

用这个:

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

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

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

编辑 :最聪明的方法恕我直言,它删除最后一点,并从文件名(即扩展名) 以下文本

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

干杯;)

正如其他人所说,限制扩展到一定数量的字符的想法是无效的。 用array_pop的想法,想一个分隔string作为一个数组,这个function对我有用…

 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