我有一个代码
$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中提取正文。知道怎么做吗?
答案 0 :(得分:38)
通过调用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);
这对我很有用。我希望它可以帮助别人。
答案 1 :(得分:19)
这个怎么样:
list($headers, $content) = explode("\r\n\r\n", $ret, 2);
...哪个应该在$ content变量中为您提供请求的正文?
答案 2 :(得分:2)
在this thread ...
中借鉴@Geoffrey出色的答案提供此线程的其他一些解决方案是而不是正确执行此操作。
\r\n\r\n
打开或服务器以100代码响应时,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);