2011-02-06 10 views
3

[下に更新]
こんにちは。ショートURLをphpを使用して短縮URL(bit.lyなど)の最終URLを取得する

スタート:
あなたはこのように、PHPの配列に5つの短いURLを(http://bit.lyのような)のコレクションを持っていることを想像:決勝、リダイレクトと

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

終了URL:
phpでこれらの短いURLの最終的なURLを取得するにはどうすればよいですか?このように:単一のURLでうまく動作しますが、

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

私は1つの方法(オンラインで見つける)を持つ複数のURLをループするときには、それだけ配列内の最後のURLで動作します。

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

} 

閉じるが、
このメソッドは動作しますが、ただ一つのURLで十分ではありません:あなたの参考のために、方法がこれです。私はそれをforループで使用することはできません。これは私がしたいことです。上記の例でforループで使用された場合、最初の4つの要素は変更されず、最終要素のみが最終的なURLに変換されます。これは、配列が5要素か500要素かにかかわらず発生します。探した

ソリューション:
は私にあなたが(むしろちょうど1より)URLのコレクションをループするために内部で使用されたときに動作するには、この方法を変更したいかについてのヒントを与えてください。

-OR-

この作業に適しているコードを知っている場合は、あなたの答えでそれを含めてください。

ありがとうございます。

アップデート:私は問題はなく、おそらくエンコード(結局、forループで正常に動作するようです)上記の方法ではないあることを発見したいくつかのさらに肝いり後
。短いURLの配列をハードコードすると、ループは正常に動作します。しかし、GETやPOSTを使ってhtml形式の改行で区切られたURLのブロックを渡すと、上記の問題が発生します。私はフォームを送信するときに、URLを何らかの形でメソッドと互換性のない形式に変更していますか?

新しいアップデート:
君たち、私は私の問題は、上記の方法とは関係のない何かが原因だったことがわかりました。私の問題は、私の短いURLのURLエンコーディングが改行文字(URLを分離する)であると思ったものを変換したことです:%0D%0Aは改行文字またはリターン文字です...そして、すべての短いURLはコレクションの最後のURLには尾に「ゴースト」文字が追加されているため、それらのURLのみを取得することは不可能です。私は幽霊のキャラクターを特定し、私のPHPが爆発的に修正され、今はすべて正常に動作します。ごめんなさい、ありがとう。

答えて

2

これは、いくつかの助けになることがあります。あなたは、おそらくこのような何かをするだろうHow to put string in array, split by new line?

、あなたはURLを取得していると仮定すると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); 
} 

私が手var_dump($final_urls);とあなたのbit.ly URLを使用して次の出力を行います:

http://codepad.org/8YhqlCo1

そして、私のソース:$_POST['short_urls'] = "http://bit.ly/123\nhttp://bit.ly/123\nhttp://bit.ly/123\nhttp://bit.ly/123";

私はまた、あなたの関数を使用して、エラーを得た:Notice: Undefined offset: 0 in /var/www/test.php on line 27 27行:print($header[0]);私はあなたがそこに何を望むかわからないんだけど...それが役立つならばここで

は、私のtest.phpです:http://codepad.org/zI2wAOWL

+0

こんにちはマイク。ありがとう。あなたの答えを見る前に、私は実際に改行文字の末尾に改行文字がありますが、コレクション内の最後のものはexplode( "\ n"、$ urlBlock)で捕捉されていませんでした。コード。これを修正して、今は動作します。 – m0rtimer

+0

問題はありませんEric。私はあなたがそれを理解してうれしいです。あなたができることの1つは、改行文字で爆発する前に、キャリッジリターン文字を何も置き換えないことです(存在しない場合は改行文字)。 – Micheal

2

私はあなたがほとんどそこにいると思います。これを試してみてください:

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

お返事ありがとうございます。そして、申し訳ありませんので、あなたの方法と私の両方のURL配列がPHPスクリプトにハードコードされている場合、うまく動作しているようです。ショートURLのリストを渡すためにHTMLフォーム(GET/POST)を使用し、配列を作成するために改行文字でそれらを爆発させると、私の問題が発生しているようです...エンコーディングの問題? – m0rtimer

関連する問題