[Обновлено внизу]
Всем привет.
Начало с короткими URL-адресами:
Представьте, что у вас есть коллекция из 5 коротких URL (например, http://bit.ly ) в php-массиве, например:
$shortUrlArray = array("http://bit.ly/123", "http://bit.ly/123", "http://bit.ly/123", "http://bit.ly/123", "http://bit.ly/123");
Завершить с окончательными, перенаправленными URL-адресами:
Как я могу получить окончательный URL-адрес этих коротких URL-адресов с помощью php? Как это:
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
У меня есть один метод (найденный онлайн), который хорошо работает с одним URL-адресом, но при переходе по нескольким 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, первые четыре элемента возвращаются без изменений, и только конечный элемент преобразуется в его окончательный url. Это случается, если ваш массив состоит из 5 элементов или 500 элементов.
Решение:
Пожалуйста, дайте мне подсказку о том, как изменить этот метод для работы внутри цикла for с набором URL-адресов (а не только одного).
-ИЛИ-
Если вы знаете код, который лучше подходит для этой задачи, включите его в свой ответ.
Заранее спасибо.
Обновить:
После некоторого дальнейшего подталкивания я обнаружил, что проблема заключается не в вышеприведенном методе (который, в конце концов, кажется, отлично работает для циклов), но, возможно, кодирует. Когда я жестко программирую массив коротких URL-адресов, цикл работает нормально. Но когда я перехожу в блок новых URL-адресов из html-формы с использованием GET или POST, возникает вышеупомянутая проблема. Являются ли URL-адреса каким-то образом измененными в формат, не совместимый с методом, когда я отправляю форму ????
Новое обновление:
Вы, ребята, я обнаружил, что моя проблема связана с чем-то, не связанным с вышеуказанным методом. Моя проблема заключалась в том, что кодировка URL-адресов моих коротких URL-адресов преобразует то, что я считал только символами новой строки (разделяя URL-адреса):% 0D% 0A, который является строкой строки или возвращаемым символом … И что все короткие URL-адреса сохраняются для окончательный url в коллекции имел призрачный символ, прикрепленный к хвосту, что делает невозможным получение окончательных URL-адресов только для них. Я идентифицировал призрак, исправил мой php-взрыв, и теперь все работает отлично. Извините и спасибо.
Это может немного помочь: как поместить строку в массив, разделить на новую строку?
Вероятно, вы бы сделали что-то подобное, предполагая, что вы получаете 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);
и ваш бит.ly URL:
И мой источник: $_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
Я думаю, что у вас почти есть это. Попробуй это:
$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); }
Я реализовал, чтобы получить каждую строку текстового файла с одним сокращенным URL-адресом на строку, соответствующий URL-адрес перенаправления:
<?php // input: textfile with one bitly shortened url per line $plain_urls = file_get_contents('in.txt'); $bitly_urls = explode("\r\n", $plain_urls); // output: where should we write $w_out = fopen("out.csv", "a+") or die("Unable to open file!"); foreach($bitly_urls as $bitly_url) { $c = curl_init($bitly_url); curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'); curl_setopt($c, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($c, CURLOPT_HEADER, 1); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 20); // curl_setopt($c, CURLOPT_PROXY, 'localhost:9150'); // curl_setopt($c, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); $r = curl_exec($c); // get the redirect url: $redirect_url = curl_getinfo($c)['redirect_url']; // write output as csv $out = '"'.$bitly_url.'";"'.$redirect_url.'"'."\n"; fwrite($w_out, $out); } fclose($w_out);
Получайте удовольствие и наслаждайтесь! PW