在需要,解释和解析字符串的PHP中分解院子实现,进行数学比较并返回布尔结果
-
01-10-2019 - |
题
我正在寻找可以解释PHP中的字符串并执行简单的数学计算的内容,然后返回布尔结果,以表达表达式是对还是错误。
例如:
- SUE类型“ 3*{mysalary}/9 = 10000”
- php将其分为两个表达式 - 爆炸('=',string);
- php获取我的数据库字段列表,并用数据替换任何“ {}”定界字段(输入到int)
- 然后PHP评估数学表达式
- PHP然后将左侧比较右侧
- 布尔结果产生。
听起来可能很复杂,但只需要非常简单。以下是约束:1/数学运算符固定为: + - / * 2/比较操作员固定为:=> <> = <= 3/不需要浮点比较,一切都可以在整数级别完成。因此,如果需要的话,任何分区都可以四舍五入或只是在最终结果中围绕
一个比较操作员只会有两个表达式。如果有任何错误,我们只会返回false。
有没有人看到已经可以做到这一点的事情了?我知道我可以做点什么,但是为什么要重新发明轮子呢?
如果您还没有看到任何东西,您愿意列出一些“陷阱”或警告时,您可以在构建它时会想到。
阅读更多后,我意识到我可以使用 分流院子算法. 。有人在PHP中实施了吗?
我知道该评估可能是执行此操作的一种简单方法,但是,我很关心用户可以很容易地使用此方法破坏某些内容或引起语法错误。我宁愿不要将其包括在解决方案中,或者如果我这样做,则需要严格控制它的使用方式。
谢谢。
杰森
解决方案
看一下 评估 phpClasses上课。这应该做几乎所有您想要的一切,包括可变替换(例如在评估表达式之前为您的示例设置“麦萨里”的价值)
其他提示
有一个 表达解析器引擎 (实施 JavaScript+节点, php, Python 和ActionScript),在 GitHub Xpresion (诗。我是作者)
引擎非常灵活且可配置 用户定义的变量, 用户定义的功能, 多态性操作员 和一般 N- ARY操作员 (例如。 三元if-then-else)
该算法是相当一般的(有人可以说, 分流院子算法)
我采用的方法是:
- 表示表达式
- 将其解析为抽象的语法树
- 执行可变替换(请参阅 渴望评估)
- 计算结果
现在...
- 分流码算法是执行步骤1和2的一种方式。
- 您可以在第二步之后检查表达式是否在句法上正确
- 您如何计算结果将取决于AST的构建方式。
最难的步骤是第二个;您必须考虑操作员的优先级,括号和其他事情,但是有很多文献(您甚至可以遵循Wikipedia链接)
为什么不简单地执行变量替换,然后执行 preg_replace("/[^0-9+-*\/]/", '', $inputString)
, ,然后使用任何一个 eval()
或者 create_function()
?如果您使用此功能,则必须确保删除可能不安全的“语句”,这就是为什么我使用preg_replace,因此它将删除任何文字字符串