正規表現で質問させてください。

改行を含む日本語にマッチするパターンを検討しています。

<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]*)'\)'";
こういうことなんですが、これだとすべてのレコードがマッチできません。

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

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2010/07/05 23:06:32
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:GoldenDawn No.2

回答回数426ベストアンサー獲得回数81

ポイント40pt

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

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

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

id:cochoo

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

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

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

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

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

2010/07/05 23:03:46

その他の回答2件)

id:Bombastus No.1

回答回数409ベストアンサー獲得回数52

ポイント40pt

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

なお、文字コードは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);  //配列を表示する
?>
id:cochoo

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

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

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

2010/07/05 08:27:37
id:GoldenDawn No.2

回答回数426ベストアンサー獲得回数81ここでベストアンサー

ポイント40pt

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

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

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

id:cochoo

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

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

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

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

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

2010/07/05 23:03:46
id:Bombastus No.3

回答回数409ベストアンサー獲得回数52

ポイント40pt

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

可能です。

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

<?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

id:cochoo

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

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

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

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

2010/07/05 23:05:53

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

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

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

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

回答リクエストを送信したユーザーはいません