
初めて質問させていただきます。
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の時点で上手く抽出出来ていないと思うのですが何がおかしいのか分かりません。
どなたかご指導のほどよろしくお願いします。
No.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";
}
?>
ご返答ありがとうございます。
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";
}
?>
と書いて見事目的通りの働きをしてくれました。
今後も機会がございましたらぜひご指導ください。
No.1
- 回答日時:
パターンと結果の出力の二カ所で間違えてます。
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";
}
}
ご返答ありがとうございます。
多次元配列の解説が非常に分かりやすく、為になりました。
今後も機会がございましたらぜひご指導のほどよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpのheader("Location:#pos")...
-
フォームで戻った際に入力済み...
-
SplFileObject を利用したとき...
-
csvファイルについて教えて下さ...
-
PHP8でWarning:Undefined varia...
-
PHPSpreadsheetによる書き出し...
-
PHPの変わった閉じタグの必要性...
-
セッション関数を使わずにファ...
-
composerをインストールしたい...
-
phpの問い合わせフォームを作っ...
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
PHPの勉強してます。 配列のと...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
-
PHPについて。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
foreachで上限回数指定方法また...
-
マッチング処理(1:N)
-
超難問 Scripting.Dictionary ...
-
Dictionary(連想配列?)の使い方
-
foreachとかの勝手な省略?
-
PHPの構文で間違えが分からない
-
PHPでこのコード自体に意味は無...
-
VB.NET で 二次元のハッシュは...
-
ftokが動かない?
-
Excel VBAでフィルター後の対象...
-
PHPで連想配列のプルダウンメニ...
-
PHP:ツリー構造をulとli要素に...
-
PHP、{}記号の意味
-
smartyでtplファイルでの2次元配列
-
配列の値によって条件分岐がし...
-
POSTで渡されるデータの数がわ...
-
pdfファイルの複数添付 引数の型
-
ulのネストをタブ区切りに変換...
-
リストボックス複数選択抽出方法
-
多次元配列の中で条件に合う要...
おすすめ情報