
本文介绍如何在 PHP 中将形如 "(5+10)-8+2*2" 的数学表达式字符串解析并计算出实际数值(如 11),重点讲解 eval() 的基本用法及其关键安全限制。
本文介绍如何在 php 中将形如 "(5+10)-8+2*2" 的数学表达式字符串解析并计算出实际数值(如 11),重点讲解 `eval()` 的基本用法及其关键安全限制。
在 PHP 中,若已有一个合法的数学运算字符串(例如 "(5+10)-8+2*2"),并希望直接获得其计算结果(即 11),最直接的方式是使用内置函数 eval():
$equation = "(5+10)-8+2*2";
echo eval("return $equation;"); // 输出:11
⚠️ 注意:eval() 要求传入的字符串是合法的 PHP 表达式语句,且必须以分号结尾(若为 return 语句则可省略分号,但推荐显式书写)。上面示例中,我们使用 "return $equation;" 包裹原始表达式,确保 eval() 执行后返回数值而非仅执行无返回值的操作。
然而,eval() 存在严重安全风险:它会将任意字符串作为 PHP 代码执行。若 $equation 来自用户输入(如表单、URL 参数),攻击者可注入恶意代码,例如:
$equation = "1; system('rm -rf /');"; // 危险!绝对禁止
因此,绝不可对未经严格校验的用户输入使用 eval()。
✅ 更安全的替代方案包括:
- 使用白名单正则预校验表达式(仅允许数字、括号、+-*/ 和空格):
if (preg_match('/^[0-9+\-*/\s()]+$/', $equation)) { echo eval("return $equation;"); } else { throw new InvalidArgumentException("Invalid expression format"); } - 或采用专用数学表达式解析库(如 thiagoalessio/php-expression-evaluator),它们通过语法分析器执行,不依赖 eval(),从根本上规避代码执行风险。
总结:eval() 可快速实现字符串数学表达式求值,但仅适用于完全可信的静态字符串;生产环境务必优先选用正则过滤或专业解析库,兼顾功能与安全。










