[在底部更新]
嗨,大家好。
从短网址开始:
想象一下,你在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爆炸,现在一切正常。对不起,谢谢。
答案 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网址
我的来源:$_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