3

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

例如:

  1. 苏类型在“3*{mysalary}/9=10000”
  2. PHP 将其拆分为两个表达式 - explode('=',string);
  3. PHP 获取我的数据库字段列表,并用数据替换任何“{}”分隔的字段(类型转换为 int)
  4. 然后 PHP 计算数学表达式
  5. php 然后将左侧与右侧进行比较
  6. 产生的布尔结果。

它可能听起来很复杂,但它只需要非常简单。以下是约束: 1/ 数学运算符固定为:+ - / * 2/ 比较运算符固定为: = > < >= <= 3/ 不需要浮点比较,一切都可以在整数级别完成。因此,如果需要,可以对任何除法进行四舍五入,或者只是对最终结果进行四舍五入

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

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

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

在阅读了更多内容后,我意识到我可以使用调车场算法。有没有人在 PHP 中实现了这个?

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

谢谢。

杰森

4

4 回答 4

2

看看 PHPClasses 上的evalMath类。这应该可以完成您想要的几乎所有事情,包括变量替换(例如在评估表达式之前在您的示例中为“mysalary”设置一个值)

于 2010-09-08T07:52:08.390 回答
2

在github Xpresion上有一个表达式解析器引擎JavaScript+NodePHPPython和 ActionScript 的实现)(ps。我是作者)

该引擎非常灵活且可配置,可以创建解析器来解析任何表达式,其中还包括用户定义的变量用户定义的函数多态运算符和一般的 n 元运算符(例如三元 if-then-else

该算法非常通用(可以说,Shunting Yard algorithm的广义变体)

于 2015-01-26T22:08:17.510 回答
0

我采取的方法是:

  1. 标记表达式
  2. 将其解析为抽象语法树
  3. 执行变量替换(参见急切评估
  4. 计算结果

现在...

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

最难的一步是第二步;你必须考虑运算符优先级、括号和其他东西,但是有很多关于这方面的文献(你甚至可以按照那个维基百科链接)

于 2010-09-08T01:54:52.237 回答
0

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

于 2010-09-08T09:17:58.687 回答