2009-04-21 7 views
1

CURLから返された一連のCURRの各行をループして、1つのヘッダーが終了し、次のヘッダーが始まるときを検出しようとしています。私はhttpヘッダが空行で終了することを知っていますが、PHPではこの改行を表すためにどの文字が使用されていますか?私は\nで試しましたが、うまくいかないようです。私は確かに何か間違っている可能性があります。PHPとHTTPヘッダー改行:どのキャラクターを使って表現しましたか?

ヘッダーの終了に使用される改行を表す文字は何ですか? \rは、私が上に一致されているべきものであることが判明 -解決

$redirect = ''; 
$regs = ''; 
foreach ($curl_response as $line) 
{ 
    if ($line != "\n") 
    { # line is not a linebreak, so we're still processing a header block 

     if (preg_match("(HTTP/[0-9]\.[0-9] [0-9]{3} .*)",$line)) 
     { # line is the status code 
      # highlight the outputted line 
      $output .= "<b style='background: yellow;'>$line</b>"; 
     } 

     elseif (preg_match("/^Location: (.*)$/m",$line,$regs)) 
     { # the line is a location header, so grab the location being redirected to 
      # highlight the outputted line 
      $output .= "<b style='background: purple; color: white;'>$line</b>"; 
      $redirect = $regs[1]; 
     } 

     else 
     { # some other header, record to output 
      $output .= $line; 
     } 

    } 

    else 
    { # we've reached a line break, so we're getting to a new block of redirects 
     $output .= "\nreached line break\n"; 
     if ($redirect != '') 
     { # if we recorded a redirect above, append it to output 
      $output .= "\n\nRedirecting to $redirect\n\n"; 
      $redirect = ''; 
     } 

    } 

} 

echo $output; 

は、ここに私の既存のコードです。非常に奇妙な。これがサイトごとに変更されるかどうか、またはそれがカールのセットであるかどうかは不明です。これまで私が試したすべてのサイトの\rです。

編集2:Doh。ヘッダーを一連の行に入れるために、私は\nで展開したからだと思います。だから、おそらくどの\r\nはそれらにも有効な終端に空行ですとあなたが、また「の\ r \ n」と「\ rを」をチェックする必要があり、今ちょうど\r ...

$c = explode("\n",$content); 

答えて

3

です。

「テキスト」タイプのメディアサブタイプは、テキスト改行としてCRLFを使用します。 HTTPは、この要件を緩和し、エンティティ本体全体で一貫して行われている場合に、改行を表す単純なCRまたはLFのテキストメディアの転送を許可します。 HTTPアプリケーションは、HTTP経由で受信したテキストメディアの改行を表すものとして、CRLF、裸のCR、および裸のLFを受け入れなければならない(MUST)。

からHTTP/1.1: Protocol Parameters - 3.7.1 Canonicalization and Text Defaults

2

ヘッダが(つまり空行)の間にあるスペースのない二重改行で終了。改行は "\ n"、 "\ r \ n"、または "\ r"のいずれかになります。後者は珍しいものですが、まだ説明する必要があります。

おそらく、あなたは

list($headers) = preg_split('/(\r\n?|\n)(\r\n?|\n)/', $httpresponse); 
のような正規表現とヘッダの終わりを見つけることができる