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