如何获取路径中包含数据的文件的扩展名


How to get extensions for files with data in paths?

我正在编写一个图像上传脚本,并将常见的图像扩展名列入白名单。我需要能够获得文件的扩展名,以确定它们是否在白名单中,但我遇到了一些url的麻烦。

下面是一个例子:

http://pisces.bbystatic.com/image/BestBuy_US/images/products/5512/5512124_ra.jpg; canvasHeight = 280; canvasWidth = 280

我代码:

echo pathinfo($url, PATHINFO_EXTENSION);

输出如下内容:

jpg;canvasHeight=280;canvasWidth=280

演示

我可以把我的代码改成这样,这就解决了这个问题:

$parts = explode(';', pathinfo($url, PATHINFO_EXTENSION));
echo $parts[0];

演示

然而,我不知道这是否是最好的方法(一方面,因为其他网站可能使用不同的数据分隔符而不是分号);

有更好的方法吗?

编辑:可能值得注意的是,我尝试在这里上传图像作为测试(使用示例URL), StackOverflow上传它没有问题。

使用pathinfo()只匹配http://google.com -> com这样的情况。首先使用parse_url来安全地获取URL路径,然后使用pathinfo来获取文件扩展名。

如果URL使用查询字符串(例如?foo=bar),该代码应该足够了。但是在您的示例中,URL使用一些自定义格式而不是查询字符串,您可以使用RegEx只选择$ext的第一个字母数字部分。

$url = 'http://pisces.bbystatic.com/image/BestBuy_US/images/products/5512/5512124_ra.jpg;canvasHeight=280;canvasWidth=280';
$ext = pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_EXTENSION);
if (!empty($ext)) {
    preg_match('/[a-zA-Z0-9]+/', $ext, $matches);
    $ext = $matches[0];
}
echo $ext;