我需要在一些PHP页面上计算任意复杂度的用户定义逻辑表达式。假设表单字段是主要变量,则需要:
- 用“变量”替换表单字段值;
- 处理比较运算符,最少使用==、<、<=、>=和>,使用符号、名称(例如分别为eq、lt、le、ge、gt);
- 处理布尔运算符not,and,or和可能的xor通过名称,符号(例如!,&&,||和^^分别);
- 处理字符串和数字的文字值;
- 是纯文本而不是XML(例如“firstname ==''或lastname =='');和
- 要有合理的表现。
现在,在过去的几年里,我写了递归下降解析器,可以构建一个表达式树,并做这种事情,但这不是一个任务,我喜欢在PHP中,所以我希望有东西在那里,至少会让我有一些方式。
建议?
5条答案
按热度按时间t5zmwmid1#
自从这个问题被问到以来,已经过去了很长时间,我碰巧在寻找一个PHP的表达式解析器。我选择使用Symfony 2.4的ExpressionLanguage组件。它可以通过packagist安装,不依赖于composer。
composer require symfony/expression-language
hwamh0ep2#
检查create_function,它从传入的字符串参数创建一个匿名函数,我不确定它的性能,但它非常灵活...
6vl6ewon3#
如果我对这个问题的理解是正确的,你想让用户用非PHP语言写出函数,然后让PHP解释它?
如果是这样的话,你可以简单地把它们的字符串替换为“lt”和“gt”......然后执行eval()。
我有一种预感,这个问题不是这么简单,但如果是这样的话,eval()可以完成这项工作。当然,那你就暴露了自己的弱点。
yizd12fk4#
看看我的infix到postfix的例子,我想你可以相对容易地将它移植到PHP。它只使用一个阵列和一些开关。没有树。栈只需要运行后缀结果。
v8wbuo2f5#
你可以尝试修改我的Evaluator类(https://github.com/djfm/Evaluator),它可以做算术表达式(目前),你也可以使用变量。实现了所有主要的PHP操作符。