解析链接:relative,absolute或url以查找扩展名

时间:2011-02-16 05:50:04

标签: php parsing path hyperlink

我有这段代码

$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

修改

要求:我需要文件的扩展名。

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

唯一的问题是这会实际执行请求,因此需要时间来接收响应(对于大图像可能会很长)。

因此,尝试使用会导致不可靠结果的文件扩展名之间的选择是因为:

  • 末尾的.png文件不一定是png图片
  • 没有扩展程序的网址很容易成为图片(不过可以提供)

必须收到检查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。