如何从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.jpg
parsing为/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