使用php获取缩短网址(如bit.ly)的最终网址

时间:2011-02-06 03:07:28

标签: php http url redirect curl

[在底部更新]
嗨,大家好。

从短网址开始:
想象一下,你在php数组中有一个包含5个短网址(如http://bit.ly)的集合,如下所示:

$shortUrlArray = array("http://bit.ly/123",
"http://bit.ly/123",
"http://bit.ly/123",
"http://bit.ly/123",
"http://bit.ly/123");

以最终重定向网址结束
如何用php获取这些短网址的最终网址?像这样:

http://www.example.com/some-directory/some-page.html
http://www.example.com/some-directory/some-page.html
http://www.example.com/some-directory/some-page.html
http://www.example.com/some-directory/some-page.html
http://www.example.com/some-directory/some-page.html

我有一种方法(在线发现)适用于单个网址,但是当循环遍历多个网址时,它只适用于数组中的最终网址。供您参考,方法如下:

function get_web_page( $url ) 
{ 
    $options = array( 
        CURLOPT_RETURNTRANSFER => true,     // return web page 
        CURLOPT_HEADER         => true,    // return headers 
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects 
        CURLOPT_ENCODING       => "",       // handle all encodings 
        CURLOPT_USERAGENT      => "spider", // who am i 
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect 
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect 
        CURLOPT_TIMEOUT        => 120,      // timeout on response 
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects 
    ); 

    $ch      = curl_init( $url ); 
    curl_setopt_array( $ch, $options ); 
    $content = curl_exec( $ch ); 
    $err     = curl_errno( $ch ); 
    $errmsg  = curl_error( $ch ); 
    $header  = curl_getinfo( $ch ); 
    curl_close( $ch ); 

    //$header['errno']   = $err; 
    //$header['errmsg']  = $errmsg; 
    //$header['content'] = $content; 
    print($header[0]); 
    return $header; 
}  


//Using the above method in a for loop

$finalURLs = array();

$lineCount = count($shortUrlArray);

for($i = 0; $i <= $lineCount; $i++){

    $singleShortURL = $shortUrlArray[$i];

    $myUrlInfo = get_web_page( $singleShortURL ); 

    $rawURL = $myUrlInfo["url"];

    array_push($finalURLs, $rawURL);

}

关闭,但不够
此方法有效,但只能使用单个URL。我不能在for循环中使用它,这是我想要做的。当在for循环中的上述示例中使用时,前四个元素不变地返回,并且只有最终元素被转换为其最终url。无论您的数组是5个元素还是500个元素,都会发生这种情况

寻求解决方案:
请给我一个提示,告诉你如何修改这个方法,以便在一个带有urls集合的for循环中使用(而不仅仅是一个)。

-OR -

如果您知道更适合此任务的代码,请将其包含在您的答案中。

提前致谢。

更新
经过一些进一步的推动,我发现问题不在于上面的方法(毕竟,它似乎在for循环中工作正常)但可能是编码。当我硬编码一个短网址数组时,循环工作正常。但是当我使用GET或POST从html表单中传入一行换行的URL时,会出现上述问题。当我提交表单????

时,网址是否以某种方式被更改为与该方法不兼容的格式

新更新:
你们,我发现我的问题是由于与上述方法无关的问题。我的问题是我的短网址的URL编码转换了我认为只是换行符(将网址分隔)到这个:%0D%0A这是换行符或返回字符...并且所有短网址都保存为集合中的最终url在尾部附加了一个“幽灵”字符,因此无法仅为这些字符检索最终的URL。我确定了幽灵角色,纠正了我的php爆炸,现在一切正常。对不起,谢谢。

3 个答案:

答案 0 :(得分:2)

我想你差不多了。试试这个:

$shortUrlArray = array("http://yhoo.it/2deaFR",
    "http://bit.ly/900913",
    "http://bit.ly/4m1AUx");

    $finalURLs = array();

    $lineCount = count($shortUrlArray);

    for($i = 0; $i < $lineCount; $i++){
            $singleShortURL = $shortUrlArray[$i];
            $myUrlInfo = get_web_page( $singleShortURL );
            $rawURL = $myUrlInfo["url"];
             printf($rawURL."\n");
            array_push($finalURLs, $rawURL);
    }

答案 1 :(得分:2)

这可能有所帮助:How to put string in array, split by new line?

你可能会做这样的事情,假设你得到了POST中返回的URL:

$final_urls = array();

$short_urls = explode( chr(10), $_POST['short_urls'] ); //You can replace chr(10) with "\n" or "\r\n", depending on how you get your urls. And of course, change $_POST['short_urls'] to the source of your string.

foreach ( $short_urls as $short ) {
    $final_urls[] = get_web_page( $short );
}

我使用var_dump($final_urls);和你的bit.ly网址

获得以下输出

http://codepad.org/8YhqlCo1

我的来源:$_POST['short_urls'] = "http://bit.ly/123\nhttp://bit.ly/123\nhttp://bit.ly/123\nhttp://bit.ly/123";

我也遇到了错误,使用了您的功能:Notice: Undefined offset: 0 in /var/www/test.php on line 27第27行:print($header[0]);我不确定您想要的是什么......

这是我的test.php,如果有帮助的话:http://codepad.org/zI2wAOWL

答案 2 :(得分:0)

我实现了获取纯文本文件的每一行,每行有一个缩短的url,相应的重定向url:

i < filters.length

玩得开心,享受! PW