我有一个具有state属性的对象,例如 state ='state4'或 state ='state2'。现在我还有一个状态属性可以获得的所有可用状态的数组, state1 到 state8 (注意:状态未命名为stateN,它们有8个不同的名称,如付款或取消。我只是用stateN来描述问题)。除此之外,我还有一个逻辑表达式,例如 $ expression =!state1 || state4&&(!state2 || state5)。这是以上描述的代码:
$state = 'state4';
$expression = '!state1||state4&&(!state2||state5)';
现在我想检查逻辑表达式是true还是false。在上述情况下,它是真实的。在下面的例子中,它将是错误的:
$state = 'state1';
$expression = state4&&!state2||(!state1||state7);
任何想法/提示如何以优雅的方式解决这个问题?
谢谢:)
答案 0 :(得分:3)
//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注入:表达式和替换是由应用程序完全控制的,不涉及用户输入。只要这样,eval
就是安全的。