需要PHP中的Shunting Yard实现,解释和解析字符串执行数学比较并返回布尔结果

时间:2010-09-08 01:27:42

标签: php string parsing math shunting-yard

我正在寻找可以在php中解释字符串并执行简单数学计算的东西,然后返回一个布尔结果,表明该表达式是真还是假。

例如:

  1. Sue类型为“3 * {mysalary} / 9 = 10000”
  2. PHP将其拆分为两个表达式 - explode('=',string);
  3. PHP获取我的数据库字段列表,并用数据替换任何“{}”分隔字段(typecasted为int)
  4. PHP然后评估数学表达式
  5. php然后将左侧与右侧进行比较
  6. 生成布尔结果。
  7. 听起来可能很复杂,但只需要非常简单。以下是约束: 1 /数学运算符固定为:+ - / * 2 /比较运算符固定为:=> < > =< = 3 /不需要浮点比较,一切都可以在整数级别完成。因此,如果需要,可以舍入任何划分,或者只是围绕最终结果

    只有两个表达式,只有一个比较运算符。 如果存在任何类型的错误,我们将返回false。

    有没有人见过可以做到这一点的事情?我知道我可以制造一些东西,但为什么要重新发明轮子呢?

    如果你还没有看到任何东西,你是否愿意列出一些你在构建时可以想到的“陷阱”或警告。

    在阅读了更多内容后,我意识到我可以使用shunting yard algorithm。有没有人在PHP中实现这个?

    我知道eval可能是一种简单的方法来执行此操作,但是,我担心用户可能很容易使用此方法破坏某些内容或导致语法错误。我宁愿不把它包含在解决方案中,或者如果我这样做,那么它需要严格控制它的使用方式。

    感谢。

    杰森

4 个答案:

答案 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)

我采取的方法是:

  1. 对表达式进行标记
  2. 将其解析为抽象语法树
  3. 执行变量替换(请参阅eager evaluation
  4. 计算结果
  5. 现在...

    • 分流码算法是执行步骤1和2的一种方法。
    • 您可以在第二步
    • 后检查表达式在语法上是否正确
    • 如何计算结果将取决于AST的构建方式。

    最艰难的一步是第二步;你必须考虑运算符优先级,括号和其他东西,但有大量的文献(你甚至可以按照维基百科链接)

答案 3 :(得分:0)

为什么不简单地执行变量替换,然后执行preg_replace("/[^0-9+-*\/]/", '', $inputString),然后使用eval()create_function()? 如果你使用这个,你必须确保删除可能不安全的“语句”,这就是为什么我使用preg_replace,所以它会删除任何文字字符串