将cURL头信息拆分为数组

4
考虑以下PHP cURL命令:
$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)应该是[状态]的值 - 所有其他头信息应该在:上分割
我没有成功地分割头信息:
explode("\r\n\r\n", $return);
explode("\r\n", $return);

这不会将标题分成数组(进一步按预期拆分等)。我做错了什么?
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);

1
很好!但是你可以用... = array_shift($data);代替... = $data[0]; array_shift($data);。这是因为array_shift返回被移除的值 - rvighne
也许有一个更简洁的解决方案:$data = explode("\n", 'Status: ' . $return); 然后删除接下来的两行。 - lm713

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


2

cURL已经支持回调函数来解析头文件。

CURLOPT_HEADERFUNCTION:一个回调函数,接受两个参数。第一个是cURL资源,第二个是要写入的包含头文件数据的字符串。该回调函数必须写入头文件数据。返回写入的字节数。

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

0

你也可以将它分成最多两个

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

记得设置 followlocation 和 max redirect,如果你想获取实际的 URL。

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl, CURLOPT_MAXREDIRS, 5);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接