我有一个具有状态属性的对象,例如 state = 'state4' 或 state = 'state2'。
现在我还有一个状态属性可以获得的所有可用状态的数组,state1 到 state8(注意:状态未命名为 stateN。它们有八个不同的名称,例如 payment 或 cancelled。我只是用 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注入(inject)的担忧:表达式和替换完全由应用程序控制,不涉及用户输入。只要这个成立,eval
就是安全的。
关于php - 评估在 PHP 中作为字符串给出的逻辑表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9173574/