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