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

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

'true && true || false'

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

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

【问题讨论】:

  • 你试过 eval("return " . $mystring) 吗?

标签: php string logic boolean


【解决方案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)

【讨论】:

  • 感谢您的帮助;我确实忘记了'回归'......呵呵
猜你喜欢
  • 2011-10-18
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
相关资源
最近更新 更多