我有这段代码
$ext = strtolower( pathinfo($source, PATHINFO_EXTENSION) );
然后我有一堆if
语句,根据扩展名计算出要运行的代码。现在这是我复杂的部分。 $ source可以是本地路径“media / images / me.png”,也可以是任何其他文件(如mp3的jpg等),或者它可以是链接,如
http://www.google.com.au/images/nav_logo36.png
我的pathinfo正确解析了上面的内容。当我像查询字符串
一样添加内容时,它会失败 http://www.google.com.au/images/nav_logo36.png?me=1
返回png?me=1
或
http://www.google.com.au/images/nav_logo36.png&s=3
返回png&s=3
甚至更糟
http://www.google.com.au/images/nav_logo36.png?j=p3nd&new_ext=.png
返回png
或可能更糟糕的
http://www.google.com.au/images/nav_logo36.png&j=p3nd&new_ext=.png
(&而不是?)
处理此问题的最佳方法是什么?我想在开始之前剥离查询字符串,但我不确定如何。
感谢。
LAMP / PHP 5.2
修改
要求:我需要文件的扩展名。
答案 0 :(得分:2)
这取决于你需要什么。如果您检索的信息位于URL中的任何位置,则可以查看函数parse_url()
。根据php手册:
<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);
?>
The above example will output:
Array
(
[scheme] => http
[host] => hostname
[user] => username
[pass] => password
[path] => /path
[query] => arg=value
[fragment] => anchor
)
/path
这将为您提供每个网址部分,以便您可以使用所需的网址。
当然通过使用$ _SERVER ['QUERY_STRING'],您只需获取查询并对其进行处理,或者将其从完整的URL中删除以获得基础浴。 因为看起来你说URL有时不是很好(使用&amp;而不是?对于第一个参数)使用explode('?',$ url)可能会导致不可预测的结果。
答案 1 :(得分:1)
使用cURL库和curl_getinfo()
请参阅:http://www.php.net/manual/en/function.curl-getinfo.php
唯一的问题是这会实际执行请求,因此需要时间来接收响应(对于大图像可能会很长)。
因此,尝试使用会导致不可靠结果的文件扩展名之间的选择是因为:
必须收到检查mimetype的响应。
如果您想尝试一下,这是一些示例代码。这会在澳大利亚网站上获取谷歌的徽标,并回显标题中收到的mimetype。
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.google.com.au/images/logos/ps_logo2.png');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
if(!curl_errno($ch)) {
$mimetype = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
echo $mimetype;
}
else {
die(curl_error($ch));
}
curl_close($ch);
您可以更进一步,实际下载文件并将其保存在某处以使用其上的Fileinfo扩展名。
file_put_contents('tmp',
file_get_contents('http://www.google.com.au/images/logos/ps_logo2.png')
);
$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo finfo_file($finfo, 'tmp');
finfo_close($finfo);
可以为不属于该类型的文件发送HTTP标头。 Fileinfo应该给出一个非常可靠的结果,因为它试图根据实际文件中的某些字节来猜测mimetype。