Как получить значения отдельных полей заголовка в PHP после получения строки заголовка с помощью CURL? - PullRequest
1 голос
/ 07 апреля 2011

Я использую 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);

Кажется, работает.Мне просто любопытно, что мое регулярное выражение здесь будет работать для каждого правильно сформированного заголовка, который я когда-либо получал от сервера, или если есть отклонения, где он сломается.Кажется, я не могу найти конкретные ограничения на допустимые символы, символы новой строки или возврат каретки, поэтому я не знаю, будут ли все значения соответствовать формату:

Имя поля, после которого следует двоеточие, после пробела, а затем - несимволы новой строки, за которыми следуют символы новой строки.

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

Я не думаю, что есть способ, которым это могло сломаться.Хотя, если вы знаете, что порядок всегда один и тот же, нет необходимости включать имя переменной в регулярное выражение, просто начните с точки с запятой.Затем вы можете просто упростить его до

/:(.*)$/m

, $ должен остановиться прямо в конце строки, и (.*) приведет к тому, что значение переменной будет включено в указанную группу.Как вы знаете, в вышеприведенном случае должно быть 4 группы.

1 голос
/ 08 апреля 2011

Я использую этот код, и у меня пока нет проблем (конечно, далеко от идеала):

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

1 голос
/ 07 апреля 2011

В PHP есть встроенный способ сделать это с помощью http_parse_headers (), который должен быть лучше, чем собственный.

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

...