如何在 PHP 中解析一串布尔逻辑

Posted

技术标签:

【中文标题】如何在 PHP 中解析一串布尔逻辑【英文标题】:How to parse a string of boolean logic in PHP 【发布时间】:2011-02-15 05:10:04 【问题描述】:

我正在构建一个带有私有成员函数的 php 类,该函数返回一个字符串值,例如:

'true && true || false'

到一个公共成员函数。 (这个字符串是一些正则表达式匹配和属性查找的结果。)我想做的是让 PHP 解析返回的逻辑,并让上述公共函数返回解析逻辑的布尔结果是真还是假。

我尝试了 eval(),但我根本没有得到任何输出。我尝试对布尔返回进行类型转换...但是无法对运算符进行类型转换...呵呵有什么想法吗? (如果您需要更多信息,请告诉我。)

【问题讨论】:

你试过 eval("return " . $mystring) 吗? 【参考方案1】:

偶然发现了这个问题,但对使用eval 感到相当不安,我决定继续寻找更好的解决方案。

当传入FILTER_VALIDATE_BOOLEAN 标志(of which there are many)时,我发现PHP 的filter_var 函数的另一个奇妙用途。

这个“单行”函数似乎在安全将字符串(或其他)对象转换为布尔值方面做得很好:

<?php

/**
 * Uses PHP's `filter_var` to validate an object as boolean
 * @param string $obj The object to validate
 * @return boolean
 */
function parse_boolean($obj) 
    return filter_var($obj, FILTER_VALIDATE_BOOLEAN);

还有一点测试:

/**
 * Let's do some testing!
 */
$tests = array (
    "yes",
    "no",
    "true",
    "false",
    "0",
    "1"
);

foreach($tests as $test) 

    $bool = parse_boolean($test);

    echo "TESTED: ";
    var_dump($test); 

    echo "GOT: ";
    var_dump($bool);

    echo "\n\n";


输出:

/*
TESTED: string(3) "yes"
GOT: bool(true)


TESTED: string(2) "no"
GOT: bool(false)


TESTED: string(4) "true"
GOT: bool(true)


TESTED: string(5) "false"
GOT: bool(false)


TESTED: string(1) "0"
GOT: bool(false)


TESTED: string(1) "1"
GOT: bool(true)
*/

我看的不够深入,但这个解决方案可能在某个地方依赖eval,但是我仍然支持使用那些普通的evaling,因为我认为filter_var 会还可以在通过eval 管道之前处理任何输入。

【讨论】:

这并没有真正解决原始问题(因为没有处理运算符)。 filter_var('true &amp;&amp; true', FILTER_VALIDATE_BOOLEAN) 返回false 当然。这是我对原始问题的误解,不应将其标记为已接受的解决方案。【参考方案2】:

eval() 可以很好地解决这个问题,但请记住你必须告诉它返回一些东西。

$string = "true && true || false";
$result = eval("return (".$string.");"); // $result will be true

如果将任何用户输入直接放入eval(),请确保对其进行清理。

【讨论】:

谢谢;我忘记了“回归”。该字符串是一个相当严格的正则表达式的结果,所以我想我会没事的。现在我将重新评估消毒效果,因为它正在起作用。再次感谢。【参考方案3】:

让我们假设 eval() 在您的情况下是一个好的/好的解决方案。

class Foo 
  private function trustworthy() 
    return 'true && true || false';
  

  public function bar() 
    return eval('return '.$this->trustworthy().';');
  


$foo = new Foo;
$r = $foo->bar();
var_dump($r);

打印bool(true)

【讨论】:

感谢您的帮助;我确实忘记了'回归'......呵呵

以上是关于如何在 PHP 中解析一串布尔逻辑的主要内容,如果未能解决你的问题,请参考以下文章

如何在 vb.net 中解析一串 xml

如何检查具有布尔值的复选框

布尔操作符解析

如何使用布尔逻辑使这个 if 语句在 python 3 中更简洁?

在 PHP 中将字符串解析为布尔值

iOS如何从解析Swift 4中获取值“布尔”