När man jobbar med att tolka Twitterstatusar och liknande så inser man snabbt att man ofta hanterar korta URL:ar, alltså en URL som används som en redirect till en annan URL för att bli kortare för att rymmas i en statusuppdatering på ett snyggt sätt.
Men i regel så vill jag inte hantera korta url:ar, utan vill ha originaladressen, så jag skrev en liten funktion för att expandera dessa URL:ar som ser ut så här:
<?
function expand_url($url){
$ourl = $url;
if ($return = get_cache_data($url, "1 month", "AAA")) return $return;
while (1){
$nr++;
if ($nr > 10){
return $url;
}
if (strstr($url, "www")) return $url;
if ($redirect = get_url_redirect($url)){
$url = $redirect;
} else {
save_cache_data($ourl, $url, "AAA");
return $url;
}
}
}
function get_url_redirect($url){
$curl = shell_exec($GLOBALS["curl_path"] . " -I -# '" . addslashes($url) . "'");
if (preg_match("/Location: (.*?)s/", $curl, $m)){
return $m[1];
} else {
return false;
}
}
?>
Så, vad den gör är att den loop:ar tills den har hittat originaladressen (eller högst tio gånger). Detta går inte snabbt, eftersom den kontaktar servarna för att hitta en "Location:" header och sedan kontrollera även den tills dess att sidan inte har någon Location-header. Så för en adress som är "förkortad" endast en gång så görs två förfrågningar, om inte adressen har innehåller "www", vilket i regel betyder att adressen inte är en förkortad version.
Så här använder du den:
print expand_url("http://flpbd.it/hNFJN");
Vill du byta ut alla adresser i en textsträng mot eventuella längre versioner av dem, använd då detta:
$string = preg_replace_callback("!(http://[^\s]*)!", create_function('$matches', 'return expand_url("$matches[0]"
;'), $string);
Kanske någon som har användning för detta?