我使用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