PHP および HTTP ヘッダーの改行:かつてはどんな文字を表現していましたか?
-
12-09-2019 - |
質問
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);
解決
あなたは、また、「\ r \ nの」と「\ rを」をチェックする必要があります。
場合は正規の形式で、テキストの改行として「テキスト」タイプの利用CRLFのメディアサブタイプ。 HTTPは、この要件を緩和し、単独でそれが全体エンティティボディのために一貫して行われる改行を表す普通CRまたはLFのテキストメディアの輸送を可能にします。 HTTPアプリケーションは、HTTPを介して受信されたテキストメディアに改行を表すものとしてCRLF、むき出しのCR、およびむき出しのLFを受け入れなければなりません。
他のヒント
ヘッダは(つまり空行)の間にスペースを入れずに、二重改行で終了します。改行は "\ rを\ n" はあるいは単に "\ R"、 "\ nを" のいずれかになります。後者は珍しいですが、それはまだ計上される必要があります。
おそらくあなたは、
のような正規表現とヘッダの終わりを見つけることができますlist($headers) = preg_split('/(\r\n?|\n)(\r\n?|\n)/', $httpresponse);