2011-04-07 27 views
1

我正在使用CURL來執行HTTP請求。我回來是這樣的:如何在使用CURL檢索標題字符串後,在PHP中檢索單個標題字段值?

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); 

這似乎是工作。我只是對我的正則表達式感到好奇,因爲這將會適用於我從服務器接收到的每一個格式良好的頭文件,或者如果有差異,它會中斷。我似乎無法找到對有效字符,換行符或回車符的具體限制,因此我不知道所有值是否都將遵循以下格式:

字段名後跟冒號,後跟空格,後跟非換行符,後面是換行符。

回答

2

我不認爲有一種方法可以打破。雖然,如果您知道訂單總是相同的,那麼不需要在正則表達式中包含變量名稱,只需以分號開頭即可。然後,你可以只是把它簡化爲

/:(.*)$/m 

$應該就在該行的末尾停止,(.*)會導致你將有包括在指定組中的變量值。如你所知,在上面的情況下應該有4個組。

+0

出於某種原因,然後我使用'm'修飾符它仍然留給我一個\ n在匹配的字符串的末尾。 – 2011-04-07 19:20:39

+0

我的意思是在最後留下一個\ r。 – 2011-04-07 19:28:24

+0

我現在可以測試的唯一方法是通過http://regex.larsolavtorvik.com/或其他一些在線regexp工具。然而,如果你真的不想匹配'\ r'和'\ n',那麼你的正則表達式的這個微小的修改就可以滿足你的需求'/:\ s([^ \ r \ n] *)[\ r \ n]?$/m'' – 2011-04-07 19:41:11

1

我用這個代碼,並沒有問題,到目前爲止(遠離當然是理想的):

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