次のような数学を安全に評価する方法があったかどうか知りたいです。
2+2
10000+12000
10000-20
2 + 2
40 - 20 + 23 - 12
eval()
入力はすべてのユーザーから取得できるため、使用する必要はありません。実装する必要があるのは、整数の加算と減算だけです。
そのためにすでに存在するスニペット、または私が遭遇していないPHP関数はありますか?
次のような数学を安全に評価する方法があったかどうか知りたいです。
2+2
10000+12000
10000-20
2 + 2
40 - 20 + 23 - 12
eval()
入力はすべてのユーザーから取得できるため、使用する必要はありません。実装する必要があるのは、整数の加算と減算だけです。
そのためにすでに存在するスニペット、または私が遭遇していないPHP関数はありますか?
eval
PHPで利用できるさまざまな数学関数を考慮して、を使用して質問します。あなたは単純な数学だけをやりたいと言いました-使用する唯一の理由eval
は、より複雑な操作を実行するか、ユーザーからの方程式を布全体で受け入れることです。
足し算または引き算だけをしたい場合は、で入力をサニタイズしintval
て町に行きます。
$number1 = '100';
$number2 = 'shell_exec(\'rm -rf *\')';
echo intval($number1) + intval($number2); // 100
試してみてください:http://codepad.org/LSUDUw1M
これは、intval
数値以外のものをすべて無視するために機能します。
100 - 20
実際にユーザー入力(つまり)から方程式全体を取得している場合はpreg_replace
、許可されている演算子と数値以外のものを削除するために使用できます。
$input = '20 + 4; shell_exec(\'rm *\')';
$input = preg_replace(
'/[^0-9+-]/',
'',
$input
);
eval('$result = '.$input.';');
echo 'result: '.$result; // 24
試してみてください:http://codepad.org/tnISDPJ3
ここでは、/[^0-9+-]/
0-9 OR + OR-以外のものと一致し、空の文字列に置き換える正規表現を使用しています。
許可された方程式をさらに深く知りたい場合は、eval
マニュアルページから直接引用してください。
// credit for code to bohwaz (http://www.php.net/manual/en/function.eval.php#107377)
$test = '2+3*pi';
// Remove whitespaces
$test = preg_replace('/\s+/', '', $test);
$number = '(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number
$functions = '(?:abs|a?cosh?|a?sinh?|a?tanh?|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;
}
ドキュメンテーション
preg_replace
-http ://php.net/manual/en/function.preg-replace.phpintval
-http ://php.net/manual/en/function.intval.phpeval
-http ://php.net/manual/en/function.eval.php式を自分で解析できます。
このようなもの:
// Minus is the same as plus a negative
// Also remove spaces after minus signs
$str = preg_replace('/-\s*(\d+)/', '+-$1', $str);
// Split on plusses
$nums = explode('+', $str);
// Trim values
$nums = array_map('trim', $nums);
// Add 'em up
echo array_sum($nums);
この方法を電卓のスクリプトで使用しました。
$field1 = $_GET["field1"];
$field2 = $_GET["field2"];
$answer = $field1 + $field2;
echo "$field1 + $field2 = $answer";