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

EOB*_*EOB 6 php boolean-logic

我有一个具有 state 属性的对象,例如state = 'state4'state = 'state2'

现在我还有一个包含 state 属性可以获得的所有可用状态的数组,state1state8注意:这些状态没有命名为 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)

如何以优雅的方式解决这个问题?

Eug*_*eck 2

//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

评论中一直有人担心evalPHP 注入:表达式和替换完全由应用程序控制,不涉及用户输入。只要保持这一点,eval就是安全的。

  • @Znarkus 没有 PHP 注入的机会:`eval`ed 表达式完全由站点所有者控制:`$expression = '!state1||state4&&(!state2||state5)';` - 那里没有用户输入! (5认同)
  • 使用“eval”非常危险,让您容易遭受 PHP 注入 (2认同)