我正在开发一个项目,我需要创建一个解析4个默认数学运算(加法,减法,乘法,除法)的函数。如果函数可以解析括号之间的操作,那将是很好的。
所以,必须要求函数首先检查乘法和除法运算(如果它们存在,则解析括号之间的所有操作后应该检查它,并且该规则应该适用于括号操作[最大的问题是括号可以包含括号])。完成所有乘法和除法运算后,它应该执行所有加法和减法运算。最终的数字应由函数返回。
另一个不错的补充是RegExp字符串,它将检查数学运算。
提前致谢!
答案 0 :(得分:4)
这应该非常安全:
function do_maths($expression) {
eval('$o = ' . preg_replace('/[^0-9\+\-\*\/\(\)\.]/', '', $expression) . ';');
return $o;
}
echo do_maths('1+1');
答案 1 :(得分:3)
你可以使用eval()(警告:确保输入的是数学运算,而不是其他任意输入或php代码。)
$input = "3 + (4 - 2 * 8) / 2";
eval('$result = ' . $input . ';');
echo "The result is $result";
答案 2 :(得分:2)
有类似的问题 How to evaluate formula passed as string in PHP? 你可以尝试从php类使用Class:Eval Math http://www.phpclasses.org/package/2695-PHP-Safely-evaluate-mathematical-expressions.html
答案 3 :(得分:1)
我可以推荐https://github.com/andig/php-shunting-yard,它是Shunting Yard算法的PSR-0兼容实现。
答案 4 :(得分:0)
正则表达式不是这里的答案;我建议使用expression tree,其中所有终端节点都是常量或变量,其余节点是运算符。例如,2 + 3 * 4
变为:
+ --- 2
|
--- * --- 3
|
--- 4
然后,使用depth-first traversal评估表达式。在PHP中,表示树很难,但您可以使用内置库作为建议的评论者,也可以使用关联的数组数组来表示它们。
答案 5 :(得分:0)
如果你想要一个真正安全的数学解析器,那么eval就不会这样做。 bcParserPHP可以做到这一点。它是用PHP实现的,不使用eval,因此非常安全。