我无法使用here中的以下函数将双缩短的网址成功转换为展开的网址:
function doShortURLDecode($url) {
$ch = @curl_init($url);
@curl_setopt($ch, CURLOPT_HEADER, TRUE);
@curl_setopt($ch, CURLOPT_NOBODY, TRUE);
@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = @curl_exec($ch);
preg_match('/Location: (.*)\n/', $response, $a);
if (!isset($a[1])) return $url;
return $a[1];
}
当我获得的扩展网址又是一个缩短的网址时,我遇到了麻烦,网址有扩展的网址。
如何通过两种URL缩短服务获得最终扩展的URL?
答案 0 :(得分:1)
由于t.co
通过使用JavaScript和/或<meta>
重定向使用HTML重定向,我们需要首先获取它的内容。然后从中提取bit.ly
URL以执行HTTP标头请求以获取最终位置。此方法不依赖于在服务器上启用cURL并使用所有本机PHP5函数:
经过测试和工作!
function large_url($url)
{
$data = file_get_contents($url); // t.co uses HTML redirection
$url = strtok(strstr($data, 'http://bit.ly/'), '"'); // grab bit.ly URL
stream_context_set_default(array('http' => array('method' => 'HEAD')));
$headers = get_headers($url, 1); // get HTTP headers
return (isset($headers['Location'])) // check if Location header set
? $headers['Location'] // return Location header value
: $url; // return bit.ly URL instead
}
// DEMO
$url = 'http://t.co/dd4b3kOz';
echo large_url($url);
答案 1 :(得分:1)
终于找到了获得双倍缩短网址的最终网址的方法。最好的方法是使用longurl api。
我不确定这是不是正确的方法,但我最后得到的输出是最终的网址:)
这就是我所做的:
<?php
function TextAfterTag($input, $tag)
{
$result = '';
$tagPos = strpos($input, $tag);
if (!($tagPos === false))
{
$length = strlen($input);
$substrLength = $length - $tagPos + 1;
$result = substr($input, $tagPos + 1, $substrLength);
}
return trim($result);
}
function expandUrlLongApi($url)
{
$format = 'json';
$api_query = "http://api.longurl.org/v2/expand?" .
"url={$url}&response-code=1&format={$format}";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $api_query );
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($ch, CURLOPT_HEADER, false);
$fileContents = curl_exec($ch);
curl_close($ch);
$s1=str_replace("{"," ","$fileContents");
$s2=str_replace("}"," ","$s1");
$s2=trim($s2);
$s3=array();
$s3=explode(",",$s2);
$s4=TextAfterTag($s3[0],(':'));
$s4=stripslashes($s4);
return $s4;
}
echo expandUrlLongApi('http://t.co/dd4b3kOz');
?>
我得到的输出是:
"http://changeordie.therepublik.net/?p=371#proliferation"
以上代码有效。
@cryptic共享的代码也正确,但我无法在我的服务器上获得结果(可能是因为某些配置问题)。
如果有人认为可以通过其他方式完成,请随时分享。
答案 2 :(得分:0)
也许您应该使用CURLOPT_FOLLOWLOCATION
= true,然后确定您定向到的最终网址。
答案 3 :(得分:0)
如果问题不是不是(如t.co或<META http-equiv="refresh"...
中那样的Java脚本重定向),则可以取消https://stackoverflow.com/q/62317
这样的堆栈交换URL:
public function doShortURLDecode($url) {
$ch = @curl_init($url);
@curl_setopt($ch, CURLOPT_HEADER, TRUE);
@curl_setopt($ch, CURLOPT_NOBODY, TRUE);
@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = @curl_exec($ch);
$cleanresponse= preg_replace('/[^A-Za-z0-9\- _,.:\n\/]/', '', $response);
preg_match('/Location: (.*)[\n\r]/', $cleanresponse, $a);
if (!isset($a[1])) return $url;
return parse_url($url, PHP_URL_SCHEME).'://'.parse_url($url, PHP_URL_HOST).$a[1];
}
它清除掉任何可能出现在curl输出中的特殊字符,然后切掉结果URL(我在php7.3服务器上遇到了这个问题)