编程语言
首页 > 编程语言> > 评估在PHP中以字符串形式给出的逻辑表达式?

评估在PHP中以字符串形式给出的逻辑表达式?

作者:互联网

我有一个具有状态属性的对象,例如state =’state4’或state =’state2′.现在,我还有状态属性可以获取的所有可用状态的数组,即state1到state8(注意:这些状态未命名为stateN,它们有8个不同的名称,例如付款或已取消.我只用stateN来描述问题) .除此之外,我还有一个逻辑表达式,例如$expression =!state1 || state4&&(!state2 || state5).这是上面描述的代码:

$state = 'state4';
$expression = '!state1||state4&&(!state2||state5)';

现在,我要检查逻辑表达式是正确还是错误.在上述情况下,它是正确的.在以下情况下,它将是错误的:

$state = 'state1';
$expression = state4&&!state2||(!state1||state7);

有什么想法/提示可以用优雅的方式解决吗?

谢谢 :)

解决方法:

//Initialize
$state = 'state4';
$expression = '!state1||state4&&(!state2||state5)';

//Adapt to your needs
$pattern='/state\d/';

//Replace
$e=str_replace($state,'true',$expression);
while (preg_match_all($pattern,$e,$matches)
   $e=str_replace($matches[0],'false',$e);

//Eval
eval("\$result=$e;");
echo $result;

编辑:

您对OQ的更新需要做一些小工作:

//Initialize
$state = 'payed';
$expression = '!payed||cancelled&&(!whatever||shipped)';

//Adapt to your needs
$possiblestates=array(
   'payed',
   'cancelled',
   'shipped',
   'whatever'
);

//Replace
$e=str_replace($state,'true',$expression);
$e=str_replace($possiblestates,'false',$e);

//Eval
eval("\$result=$e;");
echo $result;

编辑2

注释中一直存在有关eval和PHP注入的问题:表达式和替换项由应用程序完全控制,不涉及用户输入.只要这样,评估就很安全.

标签:boolean-logic,php
来源: https://codeday.me/bug/20191201/2083277.html