PHP中如何计算字符串形式数学表达式(5+10)-8+2*2得到结果11
PHP 字符串数学表达式计算实现方案
你当前的代码仅完成了表达式字符串的赋值与打印,没有触发计算逻辑,可通过以下两种方案实现直接输出计算结果:
- 方案1:
eval实现(仅适合表达式完全内部可控、无外部用户输入的场景)eval会将传入的字符串作为PHP代码直接执行,严禁传入未经过滤的用户输入内容,否则会引发严重的代码注入安全漏洞。
实现代码:<?php $equation = "(5+10)-8+2*2"; eval("\$calcResult = $equation;"); echo $calcResult; // 运行输出:11 - 方案2:自定义栈解析实现(生产环境推荐,无代码执行风险)
基于栈结构实现四则运算+括号的优先级解析,不存在代码执行风险,可自动适配数学运算的优先级规则,你给出的表达式场景可直接使用以下代码:<?php function calcEquation(string $expr): int|float { $expr = str_replace(' ', '', $expr); $numStack = []; $opStack = []; $opPriority = ['+' => 1, '-' => 1, '*' => 2, '/' => 2]; $strLen = strlen($expr); $currentNum = 0; for ($i = 0; $i < $strLen; $i++) { $char = $expr[$i]; if (is_numeric($char)) { $currentNum = $currentNum * 10 + (int)$char; if ($i === $strLen - 1 || !is_numeric($expr[$i + 1])) { array_push($numStack, $currentNum); $currentNum = 0; } } elseif ($char === '(') { array_push($opStack, $char); } elseif ($char === ')') { while (end($opStack) !== '(') { singleCalc($numStack, $opStack); } array_pop($opStack); } else { while (!empty($opStack) && end($opStack) !== '(' && $opPriority[end($opStack)] >= $opPriority[$char]) { singleCalc($numStack, $opStack); } array_push($opStack, $char); } } while (!empty($opStack)) { singleCalc($numStack, $opStack); } return end($numStack); } function singleCalc(&$numStack, &$opStack) { $right = array_pop($numStack); $left = array_pop($numStack); $operator = array_pop($opStack); $res = match($operator) { '+' => $left + $right, '-' => $left - $right, '*' => $left * $right, '/' => $left / $right }; array_push($numStack, $res); } // 调用测试 $equation = "(5+10)-8+2*2"; echo calcEquation($equation); // 运行输出:11
提示:如果需要支持幂运算、取模、数学函数等更复杂的计算逻辑,直接使用成熟的无执行风险的表达式解析组件即可,不要自行零散扩展解析逻辑,避免出现运算符优先级判断错误、括号匹配异常等问题。
内容的提问来源于stack exchange,提问作者MUHAMMED ELHALİL
相关产品推荐
相关产品推荐

