2012-02-07 114 views
3

我有一个具有状态属性的对象,例如state ='state4'state ='state2'。现在我也有一个状态属性可以得到的所有可用状态的数组,状态1状态8注意:这些状态没有命名为stateN,它们有8个不同的名称,比如付款或取消。以描述问题)。除此之外,我还有一个逻辑表达式,例如$ expression =!state1 || state4 & &(!state2 || state5)。这是以上描述的代码:在PHP中以字符串形式评估逻辑表达式?

$state = 'state4'; 
$expression = '!state1||state4&&(!state2||state5)'; 

现在我想检查逻辑表达式是真是假。在上述情况下是真实的。在下面的情况下,它将是假的:

$state = 'state1'; 
$expression = state4&&!state2||(!state1||state7); 

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

谢谢:)

回答

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

+0

使用'eval'非常危险,让你打开PHP注入 – Znarkus 2012-02-07 09:26:33

+0

谢谢,我编辑了我的问题,我认为新标准很难做到? – EOB 2012-02-07 09:38:48

+2

@Znarkus没有PHP注入机会:'eval'表达式完全由网站所有者控制:'$ expression ='!state1 || state4 &&(!state2 || state5)';' - 没有用户输入! – 2012-02-07 10:38:11

相关问题