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

时间:2010-05-03 21:09:17

标签: php string logic boolean

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

'true && true || false'

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

我尝试了eval(),但根本没有输出。我试过类型化boolean返回...但是没有办法对类型操作符进行操作...呵呵有什么想法吗? (如果您需要更多信息,请与我们联系。)

3 个答案:

答案 0 :(得分:29)

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

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

这个“一行”功能似乎在安全地将字符串(或其他)对象转换为布尔值时表现良好:

<?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某个地方的线路,但是我仍然会使用那些超过普通eval的解决方案,因为我认为在通过filter_var进行管道传输之前,eval还会处理任何输入的消毒。

答案 1 :(得分:3)

eval()对此非常合适,但请记住,你必须告诉它返回一些内容。

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

如果将任何用户输入直接放入eval()

,请确保清理它们

答案 2 :(得分:2)

我们假设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)