php - 评估在 PHP 中作为字符串给出的逻辑表达式

标签 php boolean-logic

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

现在我还有一个状态属性可以获得的所有可用状态的数组,state1state8(注意:状态未命名为 stateN。它们有八个不同的名称,例如 payment 或 cancelled。我只是用 stateN 来描述问题)。

除此之外,我还有一个逻辑表达式,例如 $expression = !state1||state4&&(!state2||state5)。这是上述描述的代码:

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

现在我想检查逻辑表达式是真还是假。在上面的例子中,这是真的。在以下情况下,它将是错误的:

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

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

最佳答案

//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注入(inject)的担忧:表达式和替换完全由应用程序控制,不涉及用户输入。只要这个成立,eval 就是安全的。

关于php - 评估在 PHP 中作为字符串给出的逻辑表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9173574/

相关文章:

php - Sed - 从 csv 文件中删除空白行

php - Zend|Db\Sql|表达式在 Zend SL 语句中不起作用

php - 如何在 PHPUnit 中将数组作为提供者的参数传递?

boolean-logic - 当且仅当某个输入为 true 时才返回 true

python - 在 Python 中动态评估简单的 boolean 逻辑

java - 在 java 中对语句使用或 "|"运算符

PHP echo 函数更改 html 输出的顺序?

ios - 创建 CGPathRef 的轮廓

python - 如何测试多个变量与单个值的相等性?

php - 将 android 连接到队列应用程序的数据库