我正在寻找一个允许我从文件名中删除扩展名的小函数。
我通过谷歌搜索发现了许多例子,但它们很糟糕,因为它们只是用“。”删除部分字符串。 。他们使用点作为限制器,只是剪切字符串。
看看这些脚本,
$from = preg_replace('/\.[^.]+$/','',$from);
或
$from=substr($from, 0, (strlen ($from)) - (strlen (strrchr($filename,'.'))));
当我们添加这样的字符串时:
This.is somestring
的例子
它只返回“This”......
扩展名可以包含3个或4个字符,因此我们必须检查点是否位于4或5位置,然后将其删除。
怎么做?
答案 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)
答案 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
或使用正则表达式...
$withoutExt = preg_replace('/\.' . preg_quote(pathinfo($path, PATHINFO_EXTENSION), '/') . '$/', '', $path);
如果你没有路径,只有一个文件名,那么这将有效并且更加轻松...
$withoutExt = pathinfo($path, PATHINFO_FILENAME);
当然,这些只是寻找最后一个时期(.
)。
答案 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;