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:
printexpand_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?