代码之家  ›  专栏  ›  技术社区  ›  Jason

需要在PHP中实现调车场,解释和解析字符串执行数学比较并返回布尔结果

  •  3
  • Jason  · 技术社区  · 16 年前

    我在寻找一些可以用PHP解释字符串并执行简单的数学计算的东西,然后返回一个布尔值结果来判断表达式是真是假。

    例如:

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

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

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

    有人已经看到可以做到这一点的东西了吗?我知道我可以做点什么,但为什么要重新发明轮子呢?

    如果你没有看到任何东西,你是否愿意列出一些在构建这个时可以想到的“gotcha”或“caveat”。

    再读了几遍之后,我意识到我可以用 shunting yard algorithm . 有人在PHP中实现了这个吗?

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

    谢谢。

    杰森

    4 回复  |  直到 11 年前
        1
  •  2
  •   Mark Baker    16 年前

    看看 evalMath 关于phpclasses的类。这几乎可以完成您想要的所有工作,包括变量替换(例如,在计算表达式之前在示例中为“mysalary”设置一个值)。

        2
  •  2
  •   Nikos M.    11 年前

    有一个 表达式分析器引擎 (的实现 JavaScript +节点 , PHP , 蟒蛇 和actionscript),打开 github Xpresion (附:我是作者)

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

    该算法相当通用(可以说,是 Shunting Yard algorithm )

        3
  •  0
  •   NullUserException Mark Roddy    16 年前

    我会采取的方法是:

    1. 标记化表达式
    2. 将其解析为抽象语法树
    3. 执行变量替换(请参见 eager evaluation )
    4. 计算结果

    现在。。。

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

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

        4
  •  0
  •   Quamis    16 年前

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