Я не смог преобразовать двойной сокращенный URL-адрес в расширенный URL-адрес успешно, используя следующую функцию, которую я получил отсюда :
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-адресом, который имеет расширенный URL-адрес.
Как получить окончательный расширенный URL-адрес после того, как он запущен через службы сокращения URL-адресов?
Поскольку t.co
использует перенаправление HTML с использованием JavaScript и / или перенаправления <meta>
нам нужно сначала захватить его содержимое. Затем извлеките из него URL-адрес bit.ly
чтобы выполнить запрос заголовка 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);
Наконец нашел способ получить окончательный URL-адрес двойного укороченного URL-адреса. Лучший способ – использовать longurl api для него.
Я не уверен, что это правильный способ, но я, наконец, получаю вывод в качестве окончательного URL-адреса 🙂
Вот что я сделал:
<?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, также верен , но я не смог получить результат на моем сервере (возможно, из-за некоторой проблемы с конфигурацией).
Если кто-то думает, что это может быть сделано каким-то другим способом, пожалуйста, не стесняйтесь делиться им.
Возможно, вам нужно просто использовать CURLOPT_FOLLOWLOCATION
= true, а затем определить конечный URL, к CURLOPT_FOLLOWLOCATION
вы были направлены.