2008-11-29 236 views
7

我需要在某些PHP页面上评估用户定义的任意复杂度的逻辑表达式。假设表单域是主要变量,它将需要:PHP中的动态逻辑表达式解析/评估?

  • 替换“varibles”表单 字段值;
  • 手柄比较运算符, 微创==,<,< =,> =和>通过 符号,名称(例如当量,LT,LE,GE,分别GT );
  • 处理布尔操作符不,和,或和 可能通过名称,符号XOR(例如, & &,||和^^分别!);
  • 处理字符串 和数字的文字值;
  • 是明文未XML(如“名字 ==‘’或姓氏==‘’);以及
  • 合理高性能

现在年来我走了已经写递归下降解析器。这可能会建立一个表达式树并做这种事情,但那不是我在PHP中所享受的任务,所以我希望有些事情能够让我至少能够在那里获得一些方式。 ?

+2

我能问,你有没有管理创建简单的表达,而不使用eval解析功能? – buggedcom 2011-11-15 21:19:02

回答

3

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

+0

Ooooo不错。我不是PHP专家,所以我不知道create_function。感谢那。 – cletus 2008-11-29 05:40:00

+1

在这里值得一提的是,已弃用PHP 7.2.0 – 2017-08-13 17:50:41

1

如果我正确地理解了这个问题,您希望用户写出非函数-PHP,然后让PHP解释它?

如果是这样,你可以简单地把它们的字符串替换为“<”和“gt”替换为“>”,然后执行eval()。我有一个预感,问题不是这么简单,但如果是这样,eval()可以完成这项工作。当然,那么你打开自己的任何形式的攻击。

+0

谢谢你的答案。其实答案可能很简单。我不是PHP专家。 Java更适合我。这些表达都不是来自外部世界。它的所有内部配置。 – cletus 2008-11-29 05:39:26

0

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

0

你可以试着将我的计算器类(https://github.com/djfm/Evaluator),它的算术表达式(现在),你可以使用的变量太多。所有主要的PHP运营商都已实施。

5

自从问了这个问题以来,时间已经过去了,而且我偶然正在为php寻找一个表达式解析器。我选择使用Symfony 2.4中的ExpressionLanguage组件。它可以通过packagist与作曲家无关地安装。

composer require symfony/expression-language