重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

初めて質問させていただきます。
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の時点で上手く抽出出来ていないと思うのですが何がおかしいのか分かりません。

どなたかご指導のほどよろしくお願いします。

A 回答 (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";
}
?>
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
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";
}

?>
と書いて見事目的通りの働きをしてくれました。

今後も機会がございましたらぜひご指導ください。

お礼日時:2008/12/26 10:15

パターンと結果の出力の二カ所で間違えてます。



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";
}
}
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
多次元配列の解説が非常に分かりやすく、為になりました。

今後も機会がございましたらぜひご指導のほどよろしくお願いします。

お礼日時:2008/12/26 10:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!