PHP中的动态逻辑表达式解析/评估?

时间:2008-11-29 02:21:03

标签: php parsing

我需要在某些PHP页面上评估任意复杂度的用户定义逻辑表达式。假设表单字段是主要变量,则需要:

  • 用“varibles”代替表格 字段值;
  • 处理比较运算符, 最低限度==,<,< =,> =和>通过 符号,名称(例如,eq,lt,le,ge,gt 分别);
  • 处理布尔运算符not,and,or 可能是xor的名字,符号(例如!, &&,||和^^分别);
  • 处理字符串的文字值 和数字;
  • 是明文而非XML(例如“firstname ==''或姓氏=='');和
  • 合理的表现。

现在,在过去的几年里,我已经编写了递归下降解析器,可以构建一个表达式树并执行此类操作,但这不是我在PHP中所做的任务,所以我希望有些东西会在那里至少让我在那里的一些方式。

建议?

6 个答案:

答案 0 :(得分:10)

自从提出这个问题以来,已经过去很多时间了,我碰巧正在为php寻找表达式解析器。我选择使用Symfony 2.4中的ExpressionLanguage组件。它可以通过packagist安装,而不是作曲家的依赖。

composer require symfony/expression-language

答案 1 :(得分:3)

检查create_function,它从传递的字符串参数创建一个匿名函数,我不确定它的性能,但它非常灵活......

答案 2 :(得分:1)

如果我正确理解了这个问题,你希望用户在非PHP中编写函数,然后用PHP解释它吗?

如果是这样,您可以简单地使用他们的字符串并将“lt”替换为“<”和“gt”与“>” ...然后做eval()。

我有预感问题不是这么简单,但如果是,eval()可以完成这项工作。当然,那么你就是为了任何一种攻击而打开自己。

答案 3 :(得分:0)

看看my infix to postfix example我认为你可以相对轻松地将它移植到PHP。它只使用一个数组和一些开关。没有树。只需要一个堆栈来运行后缀结果。

答案 4 :(得分:0)

答案 5 :(得分:0)

您可以尝试调整我的Evaluator类(https://github.com/djfm/Evaluator),它可以使用算术表达式(现在),也可以使用变量。所有主要的PHP运营商都已实施。