PHPで、行の左端から始まる複数のパターンを検索し、そのパターン以降の文字列を抽出したいとします。

ただし、パターンと次のパターンの間には、行コード(\n\r)が含まれている場合があります。

例)

●パターン
パターンA:header
パターンB:message
パターンC:footer

●検索対象の文字列
$msg="header:xxxxx
message:aaaa
bbb
cc
footer:000
111";

●抽出文字
パターンAで抽出した文字列
 :xxxxx
パターンB出した文字列
 :aaaa
 bbb
 cc
パターンCで抽出した文字列:
 :000
 111

たとえば、以下のように正規表現だと改行がうまく制御できずに困っています。

preg_match_all('/(header|message|footer)(.*?)/', $msg, $n);
$word = array_combine($n[1], $n[2]);
$header = $word['header'];
$message = $word['message'];
$footer = $word['footer'];

やはり、strstr,strpos,strlenを使って複雑ですが、順にスキャンしていく方法しかないのでしょうか?

できれば、正規表現でなんとかしたいのですが、みなさんのお知恵をお借りしたいと思います。よろしくお願いいたします。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2009/12/09 22:23:49
  • 終了:2009/12/10 00:27:36

ベストアンサー

id:GoldenDawn No.2

GoldenDawn回答回数426ベストアンサー獲得回数812009/12/10 00:11:10

ポイント50pt

すいません。質問を少し勘違いしていました。

これではどうでしょう。

preg_match_all('/(header|message|footer)(:[^:]*([\n\r]|$))/', $msg, $n) ;

http://q.hatena.ne.jp

id:cochoo

ご回答ありがとうございます。

いろいろなパターンで試したところ、期待通りの動作ができました。

実は結構ハマっていましたので、すごく助かりました。

ありがとうございました。

2009/12/10 00:27:19

その他の回答(1件)

id:GoldenDawn No.1

GoldenDawn回答回数426ベストアンサー獲得回数812009/12/09 23:18:08

ポイント20pt

こんなかんじでどうでしょうか。

preg_match_all('/^(header|message|footer)(.*?)$/m', $msg, $n) ;

http://www.php.net/manual/ja/reference.pcre.pattern.modifiers.ph...

id:cochoo

早速のご回答本当にありがとうございます。

しかし、今回のケースだとパターン修飾子mが利かないというか、たとえば以下のプログラムでは

残念ながら、改行までの文字列しか取れていませんでした。

$msg="header:xxxxx

message:aaaa

bbb

cc

footer:000

111";

preg_match_all('/^(header|message|footer)(.*?)$/m', $msg, $n) ;

print_r($n);

期待値は、":xxxxx"と":aaaa\n\rbbb\n\rcc"と":000\n\r111"が取得できることです。

2009/12/09 23:47:21
id:GoldenDawn No.2

GoldenDawn回答回数426ベストアンサー獲得回数812009/12/10 00:11:10ここでベストアンサー

ポイント50pt

すいません。質問を少し勘違いしていました。

これではどうでしょう。

preg_match_all('/(header|message|footer)(:[^:]*([\n\r]|$))/', $msg, $n) ;

http://q.hatena.ne.jp

id:cochoo

ご回答ありがとうございます。

いろいろなパターンで試したところ、期待通りの動作ができました。

実は結構ハマっていましたので、すごく助かりました。

ありがとうございました。

2009/12/10 00:27:19

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません