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

正規表現で質問させてください。
改行を含む日本語にマッチするパターンを検討しています。

<a.txt>
('20100701','雨','30℃','70%'),
('20100702','晴れ
のち曇り','28℃','55%'),
('20100703','曇り','29℃','60%');

<test.php>
$data = file_get_contents("a.txt");
$pattern = "/\('(.*)','(.*)','(.*)','(.*)'\)'";
preg_match_all($pattern, $data, $m);

<a.txt>の2つ目のレコードに改行が含まれています。
1つ目と3つ目のレコードは<test.php>でマッチできますが、2つ目のレコードが拾えません。
やりたいことは、
$pattern = "/\('([.\n\r]*)','([.\n\r]*)','([.\n\r]*)','([.\n\r]*)'\)'";
とか、
$pattern = "/\('([\w\s]*)','([\w\s]*)','([\w\s]*)','([\w\s]*)'\)'";
こういうことなんですが、これだとすべてのレコードがマッチできません。

すべてのレコードの要素をマッチさせる方法について、ご教授をお願いいたします。

●質問者: cochoo
●カテゴリ:インターネット ウェブ制作
✍キーワード:28 txt パターン マッチ レコード
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● ホーエンハイム
●40ポイント

こんな感じでいかがでしょう。

なお、文字コードはUTF-8にしてください。それ以外のコードだとpreg_match_allがうまく動作しないことがありますので。

<?php
$data = file_get_contents("a.txt");
$str = str_replace(array("\r\n","\r","\n"), '', $data); //改行を除く
preg_match_all("/\('([0-9]+)','([^']+)','([^']+)','([^']+)'\)/u", $str, $arr, PREG_SET_ORDER); //配列に分解する

var_dump($arr); //配列を表示する
?>
◎質問者からの返答

朝早くからご回答いただき、ありがとうございます。

改行を含んだ形で取り出すことは可能でしょうか?

よろしくお願いいたします。


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

s 修飾子を使ってこんな感じでしょうか。

<?php
$pattern = "/\('(.*?)','(.*?)','(.*?)','(.*?)'\)/s" ;

PHP: 正規表現パターンに使用可能な修飾子 - Manual

◎質問者からの返答

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

期待値の結果が得られました。

s修飾子をつけたつもりが徹夜続きの朝方だったので、うっかりミスだったかもしれません。

ご指摘いただけると、大変助かります。

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


3 ● ホーエンハイム
●40ポイント

改行を含んだ形で取り出すことは可能でしょうか?

可能です。

下記のようにして下さい。

<?php
$data = file_get_contents("a.txt");
preg_match_all("/\('([0-9]+)','([^']+)','([^']+)','([^']+)'\)/us", $data, $arr, PREG_SET_ORDER); //配列に分解する

var_dump($arr); //配列を表示する
?>

http://q.hatena.ne.jp/1278271469#a1025511

◎質問者からの返答

ご回答頂きありがとうございます!

s修飾子に関しては、どうやらうっかりミスで忘れていたようです。

基本的には、この方法を採用しようと思います。

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

関連質問


●質問をもっと探す●



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