我建立一个PHP类返回一个字符串值,如私有成员函数:如何解析布尔逻辑的字符串在PHP
'true && true || false'
到公共成员函数。 (这个字符串是一些正则表达式匹配和属性查找的结果。)我想要做的是PHP解析返回的逻辑,并让上述公共函数返回解析逻辑的布尔结果是true还是false。
我试过的eval(),但我得到任何输出。我尝试了类型化布尔返回值...但是没有办法对运算符进行类型转换...呵呵任何想法? (让我知道如果你需要更多的信息。)
我建立一个PHP类返回一个字符串值,如私有成员函数:如何解析布尔逻辑的字符串在PHP
'true && true || false'
到公共成员函数。 (这个字符串是一些正则表达式匹配和属性查找的结果。)我想要做的是PHP解析返回的逻辑,并让上述公共函数返回解析逻辑的布尔结果是true还是false。
我试过的eval(),但我得到任何输出。我尝试了类型化布尔返回值...但是没有办法对运算符进行类型转换...呵呵任何想法? (让我知道如果你需要更多的信息。)
只是偶然发现了这个问题,但是是相当不安使用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
在某处的路线,但是我还是使用那些通过纯eval
ING另一边,因为我认为filter_var
也将处理管道之前,消毒任何输入通过eval
。
这并不能真正解决原来的问题(因为不处理操作符)。 'filter_var('true && true',FILTER_VALIDATE_BOOLEAN)'returns'false'。 – 2012-07-16 01:41:18
绝对。这是对我原来的问题的一种误解,应该作为公认的解决办法予以标记。 – gpmcadam 2012-07-18 12:45:37
这应该是在PHP文档... – Tjorriemorrie 2013-02-06 16:21:12
假设的eval()是你的情况的OK /很好的解决方案。
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)
感谢您的帮助;我确实忘记了'回归'......嘿嘿 – TheOddLinguist 2010-05-03 21:36:22
eval()
将努力为这个完美的罚款,但请记住,你必须告诉它返回的东西。
此外,请确保您清理任何用户输入,如果直接将它们放入eval()
。
谢谢;我忘记了'回归'。字符串是一个相当紧密的正则表达式的结果,所以我认为我会没事的。现在我将重新评估这种消毒方式的效果。再次感谢。 – TheOddLinguist 2010-05-03 21:36:04
(串),正确& &真正||假
没有尝试的eval( “回归”。$ MyString的)? – Jasper 2010-05-03 21:14:14