我需要在某些PHP页面上评估任意复杂度的用户定义逻辑表达式。假设表单字段是主要变量,则需要:
现在,在过去的几年里,我已经编写了递归下降解析器,可以构建一个表达式树并执行此类操作,但这不是我在PHP中所做的任务,所以我希望有些东西会在那里至少让我在那里的一些方式。
建议?
答案 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运营商都已实施。