我如何检索单独的头字段值在PHP检索头字符串与CURL


How do I retrieve individual header field values in PHP after retrieving the header string with CURL?

我使用CURL来执行HTTP请求。我得到的结果是这样的:

HTTP/1.1 200 OK
Date: Thu, 07 Apr 2011 15:52:33 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1

我的问题是,我如何可靠地检索任何四个命名字段的值?

现在我正在做这个:

$name = 'Expires';
preg_match('/^'.$name.': ([^'r'n]*)['r'n]*$/m', $headers, $matches);

它似乎正在工作。我只是好奇我的正则表达式在这里将工作为每一个格式良好的头,我曾经收到一个服务器,或者如果有差异,它会打破。我似乎找不到有效字符,换行符或回车符的特定限制,所以我不知道是否所有值都将遵循以下格式:

Fieldname后跟冒号,后跟空格,后跟非换行字符,再后跟换行字符

我不认为它会破裂。但是,如果您知道顺序总是相同的,那么就不需要在regexp中包含变量名,只需以分号开头即可。然后,可以简化为

/:(.*)$/m

$应该停在行末尾,(.*)将导致您将变量值包含在指定的组中。如你所知,在上面的例子中,应该有4个组

PHP有内置的http_parse_headers()方法来实现这一点,这肯定是比自己动手更好的方法。

http://php.net/manual/en/function.http-parse-headers.php

我使用这段代码,到目前为止还没有出现问题(当然远非理想):

// $this->headers contains string with all headers
private function parseHeaders()
{
    $headers = array();
    foreach (explode("'n", $this->headers) as $line) {
        $line = trim($line);
        if (strpos($line, ':') !== false) {
            list($headerName, $headerValue) = explode(':', $line, 2);
            $headerValue = ltrim($headerValue);
            $headerName = strtolower(rtrim($headerName));
            if (isset($headers[$headerName])) {
                if (is_array($headers[$headerName])) {
                    $headers[$headerName][] = $headerValue;
                } else {
                    $headers[$headerName] = array(
                        $headers[$headerName],
                        $headerValue
                    );
                }
            } else {
                $headers[$headerName] = $headerValue;
            }
        }
    }
    return $headers;
}

然而,如果你想以最正确的方式做到这一点,我认为你应该阅读RFC 2616