在使用CURL检索标题字符串之后,如何在PHP中检索单个标题字段值?

在使用CURL检索标题字符串之后,如何在PHP中检索单个标题字段值?,php,regex,curl,http-headers,preg-match,Php,Regex,Curl,Http Headers,Preg Match,我使用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.': ([

我使用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()来实现这一点,这肯定是一种比自己滚动更好的方法


我使用这段代码,到目前为止没有任何问题(当然远不理想):


但是,如果你想用最正确的方式去做,我认为您应该阅读

requires pecl_http不幸地,并且仅在Linux中可用出于某种原因,然后我使用“m”修饰符,它仍然在匹配字符串的结尾留下一个\n。我的意思是它在结尾留下一个\r。我现在可以测试它的唯一方法是通过或其他在线regexp工具。但是,如果您确实不想匹配
\r
\n
,那么对regexp的这一细微修改可能最适合您的需要
'/:\s([^\r\n]*)[\r\n]?$/m'
// $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;
}