PHPの正規表現でのデータ取得について


お世話になります。
今回PHPでデータを編集するときに正規表現でお聞きしたいところがございます。

例として以下のようなテキストがあります。

05start
いちご
バナナ
うめ
もも
05finish
12start
ごはん
おそば
12finish
15start
わかめ
ひじき
めかぶ
15finish
18start
コーヒー
ココア
18finish

上記のようなテキストファイルがあり
「2桁の数字+start」から「2桁の数字+finish」までの間にあるデータを連想配列に入れたいと思っているのですが(この場合、startと
finishのとなりに付属する2桁の数字は同じ数字とします)
どのようにコードを書けば良いがわかりません。

取得しようとするデータの外側にある、2桁の数字を連想配列のキーとします。
希望する連想配列内のデータは以下のような感じです。

連想配列「data」
05 => いちご バナナ うめ もも
12 => ごはん おそば
15 => わかめ ひじき めかぶ
18 => コーヒー ココア

正規表現以外でも参考になるコードの書き方などがございましたら
是非ご教授いただけましたら幸いです。
よろしくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2017/07/03 23:04:48

ベストアンサー

id:siachan No.1

回答回数91ベストアンサー獲得回数23

phpは使ったことがないので書き方がおかしいかも知れませんが、こんなんでどうでしょう。
(気になる部分があったので少し修正)

http://ideone.com/5n4M54

<?php
$str = <<<EOS
05start
いちご
バナナ
うめ
もも
05finish
12start
ごはん
おそば
12finish
15start
わかめ
ひじき
めかぶ
15finish
18start
コーヒー
ココア
18finish
EOS;

$str = str_replace(array("\r\n", "\r"), "\n", $str);

preg_match_all('/^(\d{2})start\n([\S\s]*)\n\1finish$/m',$str,$matches);

$data = array();

for($i = 0; $i < count($matches[1]); $i++) {
   $key = $matches[1][$i];
   $value = str_replace("\n", ' ', $matches[2][$i]);
   $data[$key] = $value;
}
print_r($data);
?>
id:nagato-yuki

ご回答ありがとうございました!
またサンプルのご提示も誠にありがとうございました。
こちらの回答で希望のとおりにデータ収集ができました。

また、機会がございましたらよろしくお願い致します。

2017/07/03 23:04:35

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

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

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

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

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