人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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を使って複雑ですが、順にスキャンしていく方法しかないのでしょうか?

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

●質問者: cochoo
●カテゴリ:コンピュータ
✍キーワード:CC MESSAGE PHP Word コード
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● GoldenDawn
●20ポイント

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

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

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

◎質問者からの返答

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

しかし、今回のケースだとパターン修飾子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"が取得できることです。


2 ● GoldenDawn
●50ポイント ベストアンサー

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

これではどうでしょう。

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

http://q.hatena.ne.jp

◎質問者からの返答

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ