评估在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