获取纯扩展名的文件名


get filename with pure extension

我正在编写一个脚本,以便从站点获取图像。一切都很好,但我注意到有一些网站的图像格式如下:

http://site-name/images/dude-i-m-batman.jpg?1414151413
http://site-name/images/dude-i-m-batman.jpg?w=300

现在我正在通过来处理它

$file = substr($media,0, strrpos($image, '.') + 4);

我只是想知道这是一个好的做法还是有更好的方法。

我尝试过pathinfo和其他一些方法,但都返回了带有查询字符串的扩展名。

感谢

parse_url解析URL,检索路径部分:

 $datum = parse_url($url);
 $parts = pathinfo($datum['path']);
 $ext = $parts['extension'];

如果fopen_wrappers允许,您也可以使用getImageInfo($full_url),并检索图像信息,如宽度、高度,最重要的是,mime_type。

这是因为你会发现几个没有扩展名或有错误扩展名的文件,放在那里是为了欺骗浏览器下载为图像,并相信浏览器会识别图像格式(已经存在了,做到了:-()

显然,您现在所做的工作有一些缺点。其中一个你已经注意到你自己:

  • 并非所有URL都以文件扩展名结尾
  • 并非所有文件扩展名都是三个字母(例如.jpeg

所以你想要的是从URL中获取路径:

$imagePath = parse_url($imageUrl, PHP_URL_PATH);

然后你想从这个路径得到扩展:

$imageName = pathinfo($imagePath, PATHINFO_EXTENSION);

完成了。你不是第一个需要的人,所以这份工作的职能已经存在了。

我不确定您的意思是想要扩展还是(从当前代码判断)完整路径(减去任何查询字符串)。

两者都有:

$file = "http://site-name/images/dude-i-m-batman.jpg?1414151413";
preg_match('/^([^'?]+)(?:'?.*)?/', $file, $path_noQS);
preg_match('/(?<='.)('w{2,5})(?:'?.*)?/', $file, $extension);
echo $path_noQS[1]; //path, without QS
echo $extension[1]; //extension

您的解决方案只能使用3个字符的扩展名。如果你知道所有的扩展都是3个字符,那么这是一个完全可行的解决方案。否则:

$ext = pathinfo($filename, PATHINFO_EXTENSION);

如果你有正确的文件名,这肯定会起作用

如果出于某种原因,这不起作用,你可以使用这个:

$ext = end(explode('.', $filename));
$ext = substr(strrchr($filename, '.'), 1);
$ext = substr($filename, strrpos($filename, '.') + 1);
$ext = preg_replace('/^.*'.([^.]+)$/D', '$1', $filename);
$exts = split("[/''.]", $filename);
$n = count($exts)-1;
$ext = $exts[$n];

可能类似于这个

$parsedUrl = parse_url('http://site-name/images/dude-i-m-batman.jpg?1414151413');
$parsedFileInfo = pathinfo($parsedUrl['path']);
echo $parsedFileInfo['extension'];              

http://codepad.org/KXZwKCjs

$u = 'http://site-name/images/dude-i-m-batman.zip.jpg?1414151413?1234';
$u = explode('?', $u, 2 ); // ignore everything after the first question mark
$ext = end(explode('.',$u[0])); // last 'extension'