Obteniendo las urls finales de URLs acortadas (como bit.ly) usando php

[Actualizado en la parte inferior]
Hola a todos.

Comience con URL cortas:
Imagine que tiene una colección de 5 URL cortas (como http://bit.ly ) en una matriz php, como esta:

$shortUrlArray = array("http://bit.ly/123", "http://bit.ly/123", "http://bit.ly/123", "http://bit.ly/123", "http://bit.ly/123"); 

Finalizar con las URL redirigidas finales:
¿Cómo puedo obtener la url final de estas URL cortas con php? Me gusta esto:

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

Tengo un método (que se encuentra en línea) que funciona bien con una url única, pero cuando se repite en varias direcciones URL, solo funciona con la URL final de la matriz. Para su referencia, el método es este:

 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); } 

Cerca, pero no lo suficiente
Este método funciona, pero solo con una sola URL. No puedo usarlo en un ciclo for, que es lo que quiero hacer. Cuando se utilizan en el ejemplo anterior en un ciclo for, los primeros cuatro elementos vuelven sin cambios, y solo el elemento final se convierte en su url final. Esto sucede ya sea que su matriz tenga 5 elementos o 500 elementos de longitud.

Solución buscada:
Por favor, dame una pista de cómo modificarías este método para que funcione cuando se use dentro de un bucle for con colección de URL (en lugar de solo una).

-O-

Si conoce el código más adecuado para esta tarea, inclúyalo en su respuesta.

Gracias por adelantado.

Actualizar:
Después de seguir insistiendo, descubrí que el problema no radica en el método anterior (que, después de todo, parece funcionar bien para los bucles) sino que posiblemente codifica. Cuando codifico un conjunto de URL cortas, el ciclo funciona bien. Pero cuando paso en un bloque de URLs separadas por nueva línea de un formulario html usando GET o POST, se produce el problema mencionado anteriormente. ¿Las URL se cambian de alguna manera en un formato no compatible con el método cuando envío el formulario ????

Nueva actualización:
Chicos, he descubierto que mi problema se debe a algo que no está relacionado con el método anterior. Mi problema era que la encoding URL de mis URL cortas convertía lo que pensaba que eran solo caracteres de nueva línea (separando las URL) en esto:% 0D% 0A que es un salto de línea o un carácter de retorno … Y que todas las URL cortas guardan para el La URL final de la colección tenía un carácter “fantasma” añadido a la cola, lo que hace que sea imposible recuperar las URL finales solo para aquellos. Identifiqué el personaje fantasma, corregí mi explosión php y todo funciona bien ahora. Lo siento y gracias.

Esto puede ser de alguna ayuda: ¿Cómo poner una cuerda en una matriz, dividida por una nueva línea?

Probablemente haga algo como esto, suponiendo que obtiene las URL devueltas en POST:

 $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 ); } 

Obtengo el siguiente resultado, usando var_dump($final_urls); y tu url bit.ly:

http://codepad.org/8YhqlCo1

Y mi fuente: $_POST['short_urls'] = "http://bit.ly/123\nhttp://bit.ly/123\nhttp://bit.ly/123\nhttp://bit.ly/123";

También recibí un error al usar su función: Notice: Undefined offset: 0 in /var/www/test.php on line 27 Línea 27: print($header[0]); No estoy seguro de lo que querías allí …

Aquí está mi test.php , si sirve de ayuda: http://codepad.org/zI2wAOWL

Creo que ya casi lo tienes ahí. Prueba esto:

 $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); } 

Implementé para obtener una línea de un archivo de texto sin formato, con una url acortada por línea, la URL de redireccionamiento correspondiente:

  

¡Que se divierta y disfrute! pw