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

The*_*ist 10 php string logic boolean

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

'true && true || false'
Run Code Online (Sandbox Code Playgroud)

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

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

gpm*_*dam 29

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

我发现的是PHP的filter_var功能的另一个很好的用途,当传递FILTER_VALIDATE_BOOLEAN旗帜(其中有很多).

这个"一行"函数似乎可以很好将字符串(或其他)对象安全地转换为布尔值:

<?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);
}
Run Code Online (Sandbox Code Playgroud)

并且,一点点测试:

/**
 * 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";

}
Run Code Online (Sandbox Code Playgroud)

输出:

/*
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)
*/
Run Code Online (Sandbox Code Playgroud)

我看起来不够深入,但是这个解决方案有可能依赖于eval某个地方的线路,但是我仍然会使用那些超过平面的解决方案,eval因为我认为在filter_var处理它之前还会处理任何输入的消毒eval.

  • 绝对.这是我对原始问题的误解,应该没有标记为已接受的解决方案. (4认同)
  • 这并没有真正解决原始问题(因为没有处理运算符).`filter_var('true && true',FILTER_VALIDATE_BOOLEAN)`返回`false`. (3认同)

Vol*_*erK 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);
Run Code Online (Sandbox Code Playgroud)

印刷bool(true)