4

次のPHPcURLコマンドについて考えてみます。

$url = 'http://bit.ly/faV1vd';

$_h = curl_init();
curl_setopt($_h, CURLOPT_HEADER, 1);
curl_setopt($_h, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($_h, CURLOPT_HTTPGET, 1);
curl_setopt($_h, CURLOPT_URL, $url);
curl_setopt($_h, CURLOPT_DNS_USE_GLOBAL_CACHE, false );
curl_setopt($_h, CURLOPT_DNS_CACHE_TIMEOUT, 2 );

$return = curl_exec($_h);

これは次を返します:

HTTP/1.1 301 Moved
Server: nginx
Date: Sun, 29 Apr 2012 12:48:07 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Set-Cookie: _bit=4f9d3887-00215-020af-2f1cf10a;domain=.bit.ly;expires=Fri Oct 26 12:48:07 2012;path=/; HttpOnly
Cache-control: private; max-age=90
Location: http://www.macroaxis.com/invest/market/VZ--Sat-Feb-26-06-16-35-CST-2011?utm_source=twitterfeed&utm_medium=twitter
MIME-Version: 1.0
Content-Length: 209

次のように、ヘッダー情報を配列に分割したい

[Status] => HTTP/1.1 301 Moved,
[Server] => nginx,
[Date] => Sun, 29 Apr 2012 12:48:07 GMT,
...
[Content-Length] => 209

したがって、-最初の行(HTTP / 1.1 301 Moved)は[Status]の値である必要があります-他のすべてのヘッダー情報は分割する必要があります:

ヘッダー情報の分割に成功していません:

explode("\r\n\r\n", $return);
explode("\r\n", $return);

これはヘッダーを配列に分割しません(:期待どおりにさらに分割するなどのために。私は何が間違っているのですか?

4

4 に答える 4

7

Altaf Hussainによる回答は適切ですが、ヘッダー応答に。が含まれている場合はサポートされていません':'。すなわちX-URL: http://something.com。この場合$myarray('X-URL' => 'http')

limitこれは、パラメータを追加してに設定することで修正できます2。さらに、コロンの後にスペースが必要です。したがって、バグ修正を含む完全な解決策は次のとおりです。

$myarray=array();
$data=explode("\n",$return);

$myarray['status']=$data[0];

array_shift($data);

foreach($data as $part){
$middle=explode(": ",$part,2);
$myarray[trim($middle[0])] = trim($middle[1]);
}

print_r($myarray);
于 2013-10-17T09:28:05.533 に答える
6

これを使用して、ヘッダーを配列に分割します

$myarray = array();
$data = explode("\n",$return);

$myarray['status'] = $data[0];

array_shift($data);

foreach($data as $part){
     $middle = explode(":",$part);
     $myarray[trim($middle[0])] = trim($middle[1]);
}

print_r($myarray);

また、 curl_setopt($_h, CURLOPT_NOBODY, 1); ヘッダーのみを返す必要がある場合に使用します。

詳細については、こちらをご覧ください

http://altafphp.blogspot.com/2012/04/get-http-headers-of-any-site-using-curl.html

于 2012-04-29T13:26:49.777 に答える
2

cURLは、ヘッダーを解析するためのコールバック関数をすでにサポートしています。

CURLOPT_HEADERFUNCTION:2つのパラメーターを受け入れるコールバック。1つ目はcURLリソースで、2つ目は書き込まれるヘッダーデータを含む文字列です。ヘッダーデータは、このコールバックによって書き込まれる必要があります。書き込まれたバイト数を返します。

function handle_headers($curl, $header_line) 
{
    list($name, $value) = explode(": ", $header_line, 2);
    //do something with name/value...
    return strlen($header_line);
}

curl_setopt($curl, CURLOPT_HEADERFUNCTION, "handle_headers");
于 2016-04-20T12:01:17.177 に答える
0

最大2つに分割することもできます

explode("\r\n\r\n",$result,2);

実際のURLを取得する場合は、フォローロケーションと最大リダイレクトを設定することを忘れないでください

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl, CURLOPT_MAXREDIRS, 5);
于 2012-12-28T16:06:07.597 に答える