【问题标题】:How do I retrieve individual header field values in PHP after retrieving the header string with CURL?使用 CURL 检索标头字符串后,如何在 PHP 中检索单个标头字段值?
【发布时间】:2011-04-07 18:54:01
【问题描述】:

我正在使用 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);

它似乎正在工作。我只是对我的正则表达式感到好奇,它将适用于我从服务器收到的每个格式良好的标头,或者是否存在会破坏的差异。我似乎找不到对有效字符、换行符或回车的具体限制,所以我不知道是否所有值都遵循以下格式:

字段名后接冒号,后接空格,后接非换行符,后接换行符。

【问题讨论】:

    标签: php regex curl http-headers preg-match


    【解决方案1】:

    我认为它没有办法破坏。虽然,如果您知道顺序总是相同的,那么就不需要在正则表达式中包含变量名,只需以分号开头即可。然后,您可以将其简化为

    /:(.*)$/m
    

    $ 应该停在行尾,(.*) 将导致您将变量值包含在指定的组中。如您所知,在上述情况下应该有 4 个组。

    【讨论】:

    • 由于某种原因,我使用了 'm' 修饰符,它仍然在匹配字符串的末尾留下一个 \n。
    • 我的意思是它在最后留下一个 \r。
    • 我现在可以测试它的唯一方法是通过regex.larsolavtorvik.com 或其他一些在线正则表达式工具。但是,如果您真的不想匹配\r\n,那么您的正则表达式的这种轻微修改可能最适合您的需求'/:\s([^\r\n]*)[\r\n]?$/m'
    【解决方案2】:

    PHP 使用 http_parse_headers() 内置了执行此操作的方法,这一定是比自己滚动更好的方法。

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

    【讨论】:

    • 不幸的是需要 pecl_http
    • 并且仅在 linux 中可用
    【解决方案3】:

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

    // $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

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 2010-11-25
      • 2015-12-15
      • 2021-08-09
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多