我有一个具有 state 属性的对象,例如state = 'state4'或state = 'state2'。
现在我还有一个包含 state 属性可以获得的所有可用状态的数组,state1到state8(注意:这些状态没有命名为 stateN。它们有八个不同的名称,例如 payment 或 Canceled。我只是用 stateN 来描述问题) 。
除此之外,我还有一个逻辑表达式,例如$expression = !state1||state4&&(!state2||state5)。这是上述描述的代码:
$state = 'state4';
$expression = '!state1||state4&&(!state2||state5)';
Run Code Online (Sandbox Code Playgroud)
现在我想检查逻辑表达式是真还是假。在上面的例子中,确实如此。在以下情况下它将是错误的:
$state = 'state1';
$expression = state4&&!state2||(!state1||state7);
Run Code Online (Sandbox Code Playgroud)
如何以优雅的方式解决这个问题?
//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;
Run Code Online (Sandbox Code Playgroud)
编辑:
您对 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;
Run Code Online (Sandbox Code Playgroud)
编辑2
评论中一直有人担心eval
PHP 注入:表达式和替换完全由应用程序控制,不涉及用户输入。只要保持这一点,eval
就是安全的。