10

我有一个代码

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);        
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    $ret = curl_exec($ch);
    $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

现在我想从 $ret 中提取没有标题的正文。知道怎么做吗?

4

3 回答 3

40

raina77ow 的反应很好。从评论看来,有一些条件会导致“爆炸”不起作用。我找到了一种对我更有效的方法,并认为我会分享。

通过调用 curl_getinfo($ch, CURLINFO_HEADER_SIZE) 可以获得响应头的长度。所以我做了以下事情:

// Original Code
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);        
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
$ret = curl_exec($ch);
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// Added Code
$header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($ret, 0, $header_len);
$body = substr($ret, $header_len);

// Back to Original Code
curl_close($ch);

这对我很有用。我希望它可以帮助别人。

于 2014-03-24T21:45:39.340 回答
21

这个怎么样:

list($headers, $content) = explode("\r\n\r\n", $ret, 2);

...哪个应该在 $content 变量中为您提供请求的主体?

于 2012-04-30T13:52:49.213 回答
3

在此线程中借鉴@Geoffrey 出色的答案...

该线程提供的其他一些解决方案没有正确执行此操作。

  • 当打开或服务器以 100 代码响应时,拆分打开\r\n\r\n是不可靠的。CURLOPT_FOLLOWLOCATION
  • 通过检测标头的大小CURLINFO_HEADER_SIZE也并不总是可靠的,尤其是在使用代理或在某些相同的重定向场景中。

获取标头最可靠的方法是使用CURLOPT_HEADERFUNCTION. 然后你可以删除curl_setopt($ch, CURLOPT_HEADER, 1);,你的身体会很干净,没有标题。

这是使用 PHP 闭包执行此操作的一种非常简洁的方法。它还将所有标头转换为小写,以便跨服务器和 HTTP 版本进行一致处理。

$ch = curl_init();
$headers = [];
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Run the following function for each header received
// Note: Does NOT handle multiple instances of the same header. Later one will overwrite.
//       Consider handling that scenario if you need it.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $header) use (&$headers) {
    $len = strlen($header);
    $header = explode(':', $header, 2);
    if (count($header) >= 2)
        $headers[strtolower(trim($header[0]))] = trim($header[1]);
    return $len;
});

$data = curl_exec($ch);
print_r($headers);
于 2017-06-09T07:11:43.917 回答