PHP で、変数に入った数式の結果を得る方法を探しています。
php
1$sum = '1+2*3-4'; 2$result= eval("return {$sum};"); 3echo $sum . ' = ' . $result . PHP_EOL;
のようにevalを利用するのが一般的なのでしょうか?
*$sumはサンプルです。変化するものと思って下さい。
変数に入った数式の結果を得る方法を探している中で、eval の使用を回避するようにというアドバイスを幾つかの記事で確認しました。
多分、実務で使うには
evalを使用しない他の良い方法がある。$sumの数式をSyntax Errorにさせない定石がある。
あたりがあるのではないかと思うのですが、良い方法があれば教えてください。
よろしくお願いします。
追記
eval-PHPに数式を正規表現で拾う以下の投稿を見つけました。
php
1 $number = '(-?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)'; // What is a number 2 3 $functions = '(?:abs|atan|ceil|cos|exp|gmp_fact|intval|log(10)?|rand|round|sin|sqrt|tan)'; // Allowed PHP functions 4 $operators = '[\/*\^\+-]'; // Allowed math operators 5 $regexp = '/^([+-]?('.$number.'|'.$functions.'\s*\((?1)+\)|\((?1)+\))(?:'.$operators.'(?1))?)+$/';
結果としては以下となるので、これを加工するのが定石になるんでしょうか?
/^([+-]?((-?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)|(?:abs|atan|ceil|cos|exp|gmp_fact|intval|log(10)?|rand|round|sin|sqrt|tan)\s*\((?1)+\)|\((?1)+\))(?:[\/*\^\+-](?1))?)+$/
今回だとこんな感じ?
/^([+-]?((-?(?:0|[1-9]\d*)(?:\.\d*)?(?:[][+\-]?\d+)?)|\s*\((?1)+\)|\((?1)+\))(?:[\/*\+-](?1))?)+$/
**'^'を削除しました。
https://teratail.com/questions/66214 Rubyの質問にPHPで答えても迷惑なだけです。これ以上迷惑かけるのはやめてくれませんか。
そうですね。あちらはもう書き込む内容は無いかと。こちらの質問は独立したものとして捉えていただけると幸いです。
なるほど。では念のためですが、当質問ページで得られた回答を、どこかでさも自分が思いついたかのように受け売りすることはない、と誓えますか。そういうことするつもりが少しでもあるのなら、言っていただければ回答はしないようにします。
もともと情報を共有するために回答するのですから普通はそれでもいいのですが、今までの質問者さんの実績だと、劣化コピーをばら撒かれる可能性もあるので、慎重になっています。
自分が思いついた手段として語るつもりはないですけど、別に誓うつもりもないです^^;これは何のやり取りなんでしょうか。。。
わかりました。当面は、そういうつもりはないと理解しておくことにします。
回答5件
あなたの回答
tips
プレビュー