使用 PHP 解析数学运算

问题描述 投票:0回答:7

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

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

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

提前致谢!

php regex
7个回答
6
投票

这应该非常安全:

function do_maths($expression) {
  eval('$o = ' . preg_replace('/[^0-9\+\-\*\/\(\)\.]/', '', $expression) . ';');
  return $o;
}

echo do_maths('1+1');

2
投票

您可以使用 eval()警告:确保输入的是数学运算,而不是其他任意输入或 php 代码)。

$input = "3 + (4 - 2 * 8) / 2";

eval('$result = ' . $input . ';');

echo "The result is $result";


2
投票

我可以推荐https://github.com/andig/php-shunting-yard,这是 Shunting Yard 算法的 PSR-0 兼容实现。


0
投票

正则表达式不是这里的答案;我建议使用表达式树,其中所有终端节点都是常量或变量,其余节点是运算符。例如,

2 + 3 * 4
变为:

+ --- 2
  |
  --- * --- 3
        |
        --- 4

然后,您可以使用“深度优先遍历”来评估表达式。在 PHP 中,表示树有点困难,但您可以按照评论者的建议使用内置库,或者使用数组的关联数组来表示它们。


0
投票


0
投票
anastasd/表达式解析器

您只需使用四个算术运算符即可轻松创建自己的解析器。请使用自定义解析器查看示例。

自定义解析器

© www.soinside.com 2019 - 2024. All rights reserved.