• ベストアンサー

preg_matchの 正規表現

$phperr = failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found ; から、preg_match('   ',$phperr,$match)で、 404だけを取り出すパターン表現を教えてください。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

#1の方の回答で解決しそうですが。 > Array ( [0] => HTTP/1.1 404 [1] => 404 ) > と出ました。これはマッチした結果が2つあった、と理解してよろしいのですか? [0] の要素は、正規表現全体にマッチした部分で、 [1]の要素は正規表現の中にある一番目のカッコで捕獲された内容です。 "#HTTP/1\.[01]\s*([0-9]{3})#" カッコの中にあるのは [0-9]{3} (十進の数字三桁)ですので マッチ結果の配列の [1] だけ見れば必要なステータスコードは得られます。 RFCによると、このようなステータス行は Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF のようなフォーマットになっているとのことですので、 #(?<=HTTP/1\.[01] )\d\d\d# で必要なステータスコードだけ取れると思います。

brosis
質問者

お礼

後半の説明についていけませんでしたが、勉強するきっかけになりました。ありがとうございました。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

前提条件があいまいすぎます。 /404/ で、「404だけをとりだす」ことはできます。 $phperr = 'failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found'; preg_match('/404/',$phperr,$match); print($match[0]); 404 が、多分こういう回答がお望みではないですよね。 どういったデータあって、そのなかからどのような404を取り出したいのかを もう少し詳しくお願いします。

brosis
質問者

補足

失礼しました。 やりたいことは、$php_errormsgからコード番号だけを取り出し、 集計リストにするというものです。

回答No.1

"#HTTP/1\.[01]\s*([0-9]{3})#" こんなのはどうでしょうか。

brosis
質問者

お礼

回答ありがとうございます。 print_r()してみると、 Array ( [0] => HTTP/1.1 404 [1] => 404 ) と出ました。これはマッチした結果が2つあった、と理解してよろしいのですか?

関連するQ&A