- ベストアンサー
textより$$にはさまれた文字列を取得する方法
初めて質問させていただきます。 windowsにて、phpプログラムでtxt形式の文より$$で囲まれた文字列を抽出したいのですが上手くいきません。 サンプルとして現在使用している文は以下の通りです。 電圧に関するオームの法則は $$V=RI$$ である。 抵抗に関するオームの法則は $$R=V/I$$ である。 電流に関するオームの法則は $$I=V/R$$ である。 作成したプログラムは以下の通りです。 <?php $in = "C:/equation.txt"; $fp = fopen("$in","r"); while(!feof($fp)){ $data = fgets($fp,1024); print $data; } $patttern = "\$\$(.*)\$\$"; preg_match_all("/".$patttern."/",$data,$array); $value_list = array_values($array); foreach($value_list as $key => $value){ print $key.") ".$value."\n"; } 現状ではテキストは正常に返ってくるのですが、配列がちゃんと帰ってきません。おそらくpreg_match_allの時点で上手く抽出出来ていないと思うのですが何がおかしいのか分かりません。 どなたかご指導のほどよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
whileで抜けた後に$dataを評価していますね。 while(!feof($fp)){ $data = fgets($fp,1024); print $data; } のところを while(!feof($fp)){ $data = fgets($fp,1024); } print $data; こうすると、最後の行しか得ていないことがわかります。 パターンに関してはシングルクォーテーションの方がよいでしょう $patttern = '/\$\$(.+?)\$\$/'; また、$value_list = array_values($array);はだめです。 マッチした値を項目を拾うなら$array[1]にしないと 総じて、こんなかんじで・・・ <?php $in = "equation.txt"; $data = file_get_contents($in); $patttern = '/\$\$(.+?)\$\$/'; preg_match_all($patttern,$data,$array); $value_list = array_values($array[1]); foreach($value_list as $key => $value){ print $key.") ".$value."\n"; } ?>
その他の回答 (1)
- saintandre
- ベストアンサー率31% (194/607)
パターンと結果の出力の二カ所で間違えてます。 1,パターンの表記 パターンは「\$\$(.*)\$\$」で正しいのですがダブルクォート「"」で囲っているため 「\」が特殊文字として処理されて内容が「$$(.*)$$」になってしまっています。 シングルクォート「'」で囲って「$patttern = '\$\$(.*)\$\$';」とするか エスケープ文字をつけて「$patttern = "\\\$\\\$(.*)\\\$\\\$";」としてください。 2,結果の出力 $arrayの内容は以下のような多次元配列で返されます。 Array ( [0] => Array ( [0] => $$V=RI$$ [1] => $$R=V/I$$ [2] => $$I=V/R$$ ) [1] => Array ( [0] => V=RI [1] => R=V/I [2] => I=V/R ) ) 質問者様のプログラムですと以下のような結果しか出てきませんので。 0) Array 1) Array 以下のようにもう少し深くまで表示するようにしてください。 foreach($value_list as $key1 => $value1){ foreach($value1 as $key2 => $value2){ print $key1.") ".$key2.") ".$value2."\n"; } }
お礼
ご返答ありがとうございます。 多次元配列の解説が非常に分かりやすく、為になりました。 今後も機会がございましたらぜひご指導のほどよろしくお願いします。
お礼
ご返答ありがとうございます。 fileの取得の時点でおかしかったのですね、大変たすかりました。 <?php $in = "C:/equation.txt"; $data = file_get_contents($in); //failの全文取得 $pattern = '/\$\$(.*)\$\$/'; //$$で囲まれた部分 preg_match_all($pattern,$data,$array); $value_list = array_values($array[1]); foreach($value_list as $key => $value){ print $key.") ".$value."\n"; } ?> と書いて見事目的通りの働きをしてくれました。 今後も機会がございましたらぜひご指導ください。