我正在寻找可以在php中解释字符串并执行简单数学计算的东西,然后返回一个布尔结果,表明该表达式是真还是假。
例如:
听起来可能很复杂,但只需要非常简单。以下是约束: 1 /数学运算符固定为:+ - / * 2 /比较运算符固定为:=> < > =< = 3 /不需要浮点比较,一切都可以在整数级别完成。因此,如果需要,可以舍入任何划分,或者只是围绕最终结果
只有两个表达式,只有一个比较运算符。 如果存在任何类型的错误,我们将返回false。
有没有人见过可以做到这一点的事情?我知道我可以制造一些东西,但为什么要重新发明轮子呢?
如果你还没有看到任何东西,你是否愿意列出一些你在构建时可以想到的“陷阱”或警告。
在阅读了更多内容后,我意识到我可以使用shunting yard algorithm。有没有人在PHP中实现这个?
我知道eval可能是一种简单的方法来执行此操作,但是,我担心用户可能很容易使用此方法破坏某些内容或导致语法错误。我宁愿不把它包含在解决方案中,或者如果我这样做,那么它需要严格控制它的使用方式。
感谢。
杰森
答案 0 :(得分:2)
查看PHPClasses上的evalMath课程。这应该做你想要的所有事情,包括变量替换(例如在评估表达式之前在你的例子中设置“mysalary”的值)
答案 1 :(得分:2)
有一个表达式解析器引擎( JavaScript + Node , PHP , Python 和ActionScript的实现) ,在github Xpresion上(ps。我是作者)
引擎非常灵活且可配置,可以创建解析器,解析任何表达式,其中还包括用户定义的变量,用户定义的函数,多态运营商和一般 n-ary运营商(例如三元if-then-else )
该算法非常通用(可以说是Shunting Yard algorithm)的广义变体
答案 2 :(得分:0)
我采取的方法是:
现在...
最艰难的一步是第二步;你必须考虑运算符优先级,括号和其他东西,但有大量的文献(你甚至可以按照维基百科链接)
答案 3 :(得分:0)
为什么不简单地执行变量替换,然后执行preg_replace("/[^0-9+-*\/]/", '', $inputString)
,然后使用eval()
或create_function()
?
如果你使用这个,你必须确保删除可能不安全的“语句”,这就是为什么我使用preg_replace,所以它会删除任何文字字符串