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

时间:2012-02-07 09:10:52

标签: php boolean-logic

我有一个具有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);

任何想法/提示如何以优雅的方式解决这个问题?

谢谢:)

1 个答案:

答案 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就是安全的。