3

次のような数学を安全に評価する方法があったかどうか知りたいです。

2+2
10000+12000
10000-20
2 + 2
40 - 20 + 23 - 12

eval()入力はすべてのユーザーから取得できるため、使用する必要はありません。実装する必要があるのは、整数の加算と減算だけです。

そのためにすでに存在するスニペット、または私が遭遇していないPHP関数はありますか?

4

3 に答える 3

4

evalPHPで利用できるさまざまな数学関数を考慮して、を使用して質問します。あなたは単純な数学だけをやりたいと言いました-使用する唯一の理由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;
}

ドキュメンテーション

于 2012-08-24T19:12:38.797 に答える
3

式を自分で解析できます。

このようなもの:

// 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);

デモ:http ://codepad.org/ANc0gh27

于 2012-08-24T19:11:59.003 に答える
0

この方法を電卓のスクリプトで使用しました。

$field1 = $_GET["field1"];
$field2 = $_GET["field2"];

$answer = $field1 + $field2;
echo "$field1 + $field2 = $answer";
于 2012-08-24T19:14:12.913 に答える