PHP中是否支持将字符串形式的运算表达式用于数学运算?
问题原因
直接写$result = $number + $variable;拿不到正确结果,是PHP的隐式类型转换规则导致的:字符串参与算术运算时,PHP只会提取字符串开头的连续数字值做转换,碰到第一个非数字字符就截断。你这里$variable的值是"0 - 10",转换后只能拿到开头的0,最后算出来是50 + 0 = 50,当然得不到预期的40。
实现方案
安全提醒:绝对不能不加校验直接执行外部返回的字符串,否则会引入严重的远程代码执行漏洞
不需要修改$variable原有的字符串格式,先做严格的白名单校验,确认字符串里只包含数学运算允许的字符(数字、四则运算符、括号、小数点、空格),再拼接成合法表达式计算即可:
$number = "50"; // 服务器返回的原始字符串,保持原有带引号的格式不改动 $variable = "0 - 10"; // 校验规则:只允许数字、四则运算符、括号、小数点、空格 if (!preg_match('/^[\d+\-*\/().\s]+$/', $variable)) { throw new \Exception("运算片段包含非法字符,拒绝执行"); } // 拼接完整表达式计算 eval("\$result = $number + $variable;"); echo $result; // 输出:40
如果业务安全等级要求很高,不想用eval,可以接入专门的数学表达式解析库来做计算,彻底堵死代码执行的风险。
内容的提问来源于stack exchange,提问作者Club
相关产品推荐
相关产品推荐

