2009-09-18 79 views
10

我正在使用PHP來解析HTTP狀態碼響應的數字部分。給定一個標準的「HTTP/1.1 200 OK」響應,我會使用:解析HTTP狀態碼

$data = explode(' ', "HTTP/1.1 200 OK"); 
$code = $data[1]; 

我不是HTTP專家。如果上面的例子中的代碼不在$ data [1]的位置,我會遇到一個響應嗎?我只是想確保這種分隔響應代碼的方法將始終適用於任何響應。

感謝布

+2

如果你使用cURL,你可能會這樣:curl_getinfo($ ch,CURLINFO_HTTP_CODE);這將返回200或任何http狀態。 – Mickey 2009-09-18 07:20:12

回答

14

如有疑問,請檢查規格。在這種情況下,HTTP/1.1的規格是RFC2616。在Section 6.1,它描述了狀態行,一個響應的第一組分,如:

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF 

即 - 單一ASCII空間(SP)必須分開HTTP版本狀態碼 - 如果你檢查的定義HTTP版本(在Section 3.1)它不能包含空格,也不可以在狀態碼

所以你很高興與該代碼。

+0

非常感謝 – Brian 2009-09-18 04:17:52

6

不,你永遠不會遇到的響應(如果它是一個正確的HTTP響應),其具有不同的格式。請參閱HTTP RFC (2616)

+1

請參閱RFC 2616(http 1.1)和RFC 1945(http 1.0)中的6.1狀態行。他們都確保這3部分,空間分隔的格式。 – mjv 2009-09-18 04:03:29

1

不,如果你想要的只是數字,你在做什麼是可以的。如果你也想要這個消息,你最終也會分裂它,也就是說。

HTTP/1.1 404 Not Found 
+2

爲了防止這種情況,我使用可選的'$ limit'參數,如: '$ aHttpResp = explode('',HttpComm :: $ headers [0],3); \t \t \t \t \t \t // HTTP/1.x ccc〜響應的長描述〜' – grantwparks 2009-10-22 04:58:15

6

沒有如果Web服務器尊重標準做一個爆炸和高速緩存陣列的第二個項目是精

如果你真的希望確保使用正則表達式

preg_match('|HTTP/\d\.\d\s+(\d+)\s+.*|',$subject,$match); 
var_dump($match[1]); 

乾杯