-1

什么是一个好的算法或至少是一些代码来解析和计算一些自定义数学表达式?

例如:

abs(add(subtract(5,10),abs(add(2,4))))

另一个例子:

abs(add(add(2,6),subtract(7,multiply(-1,multiply(-1,5)))))

所以这将评估为 5-10 = -5,然后 2 + 4 = 6。6 的绝对值只是 6。然后下一个操作是 -5 + 6 = 1,其绝对值为 1。

所以试图找到一个解决方案来解析这样的东西而不使用 eval()。

这是我到目前为止所尝试的。

$expr = "abs(add(subtract(5,10),abs(add(2,4))))";

$expr_array = preg_split("/(subtract\()/", $expr, NULL, PREG_SPLIT_DELIM_CAPTURE |    PREG_SPLIT_NO_EMPTY);

    foreach($expr_array as $key => $value) {
            $value = preg_replace("/(\)|\()/", "", $value);
            echo $value."\n";
    }

这只会呈现

absadd 减 5,10,absadd2,4

但是仍然需要一个好的方法来解析它并区分每个()中的操作数。如果是相同的格式会更容易。

我曾想过使用 preg_split 来解析字符串,还为操作数创建单独的数组,另一个为数字创建单独的数组,但其中一些数字是实际操作数,其中包含数字,例如 abs(add(2,4)。想法?

4

1 回答 1

0

您可以尝试使用正则表达式和递归函数来处理它。

$pattern = '/^\s*(.+?)\s*\(\s*(.+?)\s*\)\s*$/';
于 2013-10-11T17:13:55.160 回答