改行を含む日本語にマッチするパターンを検討しています。
<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]*)'\)'";
こういうことなんですが、これだとすべてのレコードがマッチできません。
すべてのレコードの要素をマッチさせる方法について、ご教授をお願いいたします。
s 修飾子を使ってこんな感じでしょうか。
<?php $pattern = "/\('(.*?)','(.*?)','(.*?)','(.*?)'\)/s" ;
こんな感じでいかがでしょう。
なお、文字コードは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); //配列を表示する ?>
朝早くからご回答いただき、ありがとうございます。
改行を含んだ形で取り出すことは可能でしょうか?
よろしくお願いいたします。
s 修飾子を使ってこんな感じでしょうか。
<?php $pattern = "/\('(.*?)','(.*?)','(.*?)','(.*?)'\)/s" ;
ご回答いただきありがとうございます。
期待値の結果が得られました。
s修飾子をつけたつもりが徹夜続きの朝方だったので、うっかりミスだったかもしれません。
ご指摘いただけると、大変助かります。
ありがとうございました!
改行を含んだ形で取り出すことは可能でしょうか?
可能です。
下記のようにして下さい。
<?php $data = file_get_contents("a.txt"); preg_match_all("/\('([0-9]+)','([^']+)','([^']+)','([^']+)'\)/us", $data, $arr, PREG_SET_ORDER); //配列に分解する var_dump($arr); //配列を表示する ?>
ご回答頂きありがとうございます!
s修飾子に関しては、どうやらうっかりミスで忘れていたようです。
基本的には、この方法を採用しようと思います。
ありがとうございました!!
ご回答いただきありがとうございます。
期待値の結果が得られました。
s修飾子をつけたつもりが徹夜続きの朝方だったので、うっかりミスだったかもしれません。
ご指摘いただけると、大変助かります。
ありがとうございました!