1

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

ヘッダーを終了するために使用される改行を表すために使用される文字は?

これが私の既存のコードです:

$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が私が照合していたはずのものであることが判明しました。非常に奇妙な。これがサイトごとに変わるのか、それともカールに設定されているのかはわかりません。これまでのところ、\r私が試したすべてのサイトでそうです。

編集2:ドー。ヘッダーを行の配列に入れるために、 で展開したためだと思います\n。だから、おそらく\r\n今はただ\r...

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

2 に答える 2

3

"\r\n" と "\r" も確認する必要があります。これらも空行の終端として有効です。

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

-- HTTP/1.1: プロトコル パラメータ - 3.7.1 正規化とテキストのデフォルト

于 2009-04-21T04:56:23.773 に答える
2

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

おそらく、次のような正規表現でヘッダーの終わりを見つけることができます

list($headers) = preg_split('/(\r\n?|\n)(\r\n?|\n)/', $httpresponse);
于 2009-04-21T05:12:14.780 に答える