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))?)+$/
**'^'を削除しました。
回答5件
あなたの回答
tips
プレビュー