PHP如何从带参数的图片URL中获取文件扩展名?
问题描述
我有一个带可变查询参数(比如高度h、宽度w)的图片URL,想要从中提取文件扩展名。作为PHP新手,我试了两段代码但没得到想要的结果,希望能得到帮助:
第一段代码:
$imageURL = 'https://digitalcontent.api.tesco.com/v2/media/ghs/be29dc93-727d-499f-b23d-a74a92989ad2/2dc3074e-2142-4625-a91e-29edd9da68bc_711691422.jpeg?h=225&w=225'; $ext = pathinfo($imageURL, PATHINFO_EXTENSION); echo $ext;
第二段代码:
$ext = pathinfo($imageURL, PATHINFO_EXTENSION); $ext2 = preg_replace('/^\.*\.([^.]+)$/D', '$1', $imageURL); echo $ext; echo $ext2;
解决方案
你的代码问题在于:直接用pathinfo处理带查询参数的URL时,它会把?及后面的内容当成文件名的一部分;而第二段的正则表达式匹配规则完全不适合当前URL结构。下面是几种实用的解决方法:
方法1:先剥离查询参数再用pathinfo
通过parse_url提取URL的路径部分,再用pathinfo获取扩展名,这是最稳妥的方式:
$imageURL = 'https://digitalcontent.api.tesco.com/v2/media/ghs/be29dc93-727d-499f-b23d-a74a92989ad2/2dc3074e-2142-4625-a91e-29edd9da68bc_711691422.jpeg?h=225&w=225'; // 解析URL,单独提取路径部分 $urlPath = parse_url($imageURL, PHP_URL_PATH); // 从路径中获取扩展名 $ext = pathinfo($urlPath, PATHINFO_EXTENSION); echo $ext; // 输出:jpeg
方法2:正则表达式直接匹配
用正则精准匹配最后一个.到?(或URL结尾)之间的内容:
$imageURL = 'https://digitalcontent.api.tesco.com/v2/media/ghs/be29dc93-727d-499f-b23d-a74a92989ad2/2dc3074e-2142-4625-a91e-29edd9da68bc_711691422.jpeg?h=225&w=225'; preg_match('/\.([^.?]+)(?:\?|$)/', $imageURL, $matches); $ext = isset($matches[1]) ? $matches[1] : ''; echo $ext; // 输出:jpeg
方法3:用strtok和explode拆分
先截断查询参数,再通过拆分文件名获取扩展名:
$imageURL = 'https://digitalcontent.api.tesco.com/v2/media/ghs/be29dc93-727d-499f-b23d-a74a92989ad2/2dc3074e-2142-4625-a91e-29edd9da68bc_711691422.jpeg?h=225&w=225'; // 截断?及后面的内容 $urlWithoutQuery = strtok($imageURL, '?'); // 拆分文件名并取最后一段 $parts = explode('.', basename($urlWithoutQuery)); $ext = end($parts); echo $ext; // 输出:jpeg
内容的提问来源于stack exchange,提问作者Kevin Deery
相关产品推荐
相关产品推荐

