[下に更新]
こんにちは。ショート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が爆発的に修正され、今はすべて正常に動作します。ごめんなさい、ありがとう。
こんにちはマイク。ありがとう。あなたの答えを見る前に、私は実際に改行文字の末尾に改行文字がありますが、コレクション内の最後のものはexplode( "\ n"、$ urlBlock)で捕捉されていませんでした。コード。これを修正して、今は動作します。 – m0rtimer
問題はありませんEric。私はあなたがそれを理解してうれしいです。あなたができることの1つは、改行文字で爆発する前に、キャリッジリターン文字を何も置き換えないことです(存在しない場合は改行文字)。 – Micheal