使用PHP解析数学运算

时间:2011-04-27 11:56:24

标签: php regex

我正在开发一个项目,我需要创建一个解析4个默认数学运算(加法,减法,乘法,除法)的函数。如果函数可以解析括号之间的操作,那将是很好的。

所以,必须要求函数首先检查乘法和除法运算(如果它们存在,则解析括号之间的所有操作后应该检查它,并且该规则应该适用于括号操作[最大的问题是括号可以包含括号])。完成所有乘法和除法运算后,它应该执行所有加法和减法运算。最终的数字应由函数返回。

另一个不错的补充是RegExp字符串,它将检查数学运算。

提前致谢!

6 个答案:

答案 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)

答案 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,因此非常安全。