PHP中的动态逻辑表达式解析/求值

csga3l58  于 2023-05-21  发布在  PHP
关注(0)|答案(5)|浏览(202)

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

  • 用“变量”替换表单字段值;
  • 处理比较运算符,最少使用==、<、<=、>=和>,使用符号、名称(例如分别为eq、lt、le、ge、gt);
  • 处理布尔运算符not,and,or和可能的xor通过名称,符号(例如!,&&,||和^^分别);
  • 处理字符串和数字的文字值;
  • 是纯文本而不是XML(例如“firstname ==''或lastname =='');和
  • 要有合理的表现。

现在,在过去的几年里,我写了递归下降解析器,可以构建一个表达式树,并做这种事情,但这不是一个任务,我喜欢在PHP中,所以我希望有东西在那里,至少会让我有一些方式。
建议?

t5zmwmid

t5zmwmid1#

自从这个问题被问到以来,已经过去了很长时间,我碰巧在寻找一个PHP的表达式解析器。我选择使用Symfony 2.4的ExpressionLanguage组件。它可以通过packagist安装,不依赖于composer。
composer require symfony/expression-language

hwamh0ep

hwamh0ep2#

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

6vl6ewon

6vl6ewon3#

如果我对这个问题的理解是正确的,你想让用户用非PHP语言写出函数,然后让PHP解释它?
如果是这样的话,你可以简单地把它们的字符串替换为“lt”和“gt”......然后执行eval()。
我有一种预感,这个问题不是这么简单,但如果是这样的话,eval()可以完成这项工作。当然,那你就暴露了自己的弱点。

yizd12fk

yizd12fk4#

看看我的infix到postfix的例子,我想你可以相对容易地将它移植到PHP。它只使用一个阵列和一些开关。没有树。栈只需要运行后缀结果。

v8wbuo2f

v8wbuo2f5#

你可以尝试修改我的Evaluator类(https://github.com/djfm/Evaluator),它可以做算术表达式(目前),你也可以使用变量。实现了所有主要的PHP操作符。

相关问题