いくつかのデータを計算するアプリケーションを構築する必要があります。私は科学者がどのような計算を求められるのか分かりません。算術計算をどのように評価するのですか?
例えば、Aは、(A + 5)を計算することになるでしょう ユーザー* 3 ユーザBは、(A + 14)を計算することになるでしょう²* PI
算術演算式は科学者によって定義され、中に格納されています管理者別にデータベース。
簡単な方法を行うことです。
- 行うには:
<?php //Formula is initialized by a query in database $formula= '(A + 3) * 5'; //$ value is an integer entered by UserA and verify by Controller $value = 42; $arithmetic = str_replace('A', $formula, $value); $result = eval($arithmetic);
しかし、それはこのanswer
に@thplによって説明されるようevalは悪である私は2つのオプションがあります数式の各文字を分析して変換し、 は素晴らしい計算クラスを作成します。 (良い(確保?)正規表現で
$formula
を点検し、悪eval
関数を呼び出す。
+
の各側のオペランドを見つけ、addition
メソッドの呼び出しによって+
文字を置き換えます。 最初のソリューションは、より多くの確保が、開発は非常に長いようで
第二の溶液のために、私は、PHPのドキュメントでこれを見つけた:
<?php
$test = '2+3*pi';
// Remove whitespaces
$test = preg_replace('/\s+/', '', $test);
$number = '(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number
$functions = '(?:sinh?|cosh?|tanh?|abs|acosh?|asinh?|atanh?|exp|log10|deg2rad|rad2deg|sqrt|ceil|floor|round)'; // Allowed PHP functions
$operators = '[+\/*\^%-]'; // Allowed math operators
$regexp = '/^((' . $number . '|' . $functions . '\s*\((?1)+\)|\((?1)+\))(?:' . $operators . '(?2))?)+$/'; // Final regexp, heavily using recursive patterns
if (preg_match($regexp, $q)) {
$test = preg_replace('!pi|π!', 'pi()', $test); // Replace pi with pi function
eval('$result = ' . $test . ';');
} else {
$result = false;
}
最初の質問:2番目の解決策は十分安全ですか?
私はインターネットで(もちろん)検索しましたが、最良の解決策は前のコードです。いくつかのPHP関数、真珠やPECLライブラリが私を助けることがありますか? arithmetic_eval
機能?
(私の質問は唯一のPHPに関するので、私はSecurity.SEに聞かないでください)