2010-05-03 70 views
9

我建立一个PHP类返回一个字符串值,如私有成员函数:如何解析布尔逻辑的字符串在PHP

'true && true || false' 

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

我试过的eval(),但我得到任何输出。我尝试了类型化布尔返回值...但是没有办法对运算符进行类型转换...呵呵任何想法? (让我知道如果你需要更多的信息。)

+1

没有尝试的eval( “回归”。$ MyString的)? – Jasper 2010-05-03 21:14:14

回答

28

只是偶然发现了这个问题,但是是相当不安使用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

+3

这并不能真正解决原来的问题(因为不处理操作符)。 'filter_var('true && true',FILTER_VALIDATE_BOOLEAN)'returns'false'。 – 2012-07-16 01:41:18

+4

绝对。这是对我原来的问题的一种误解,应该作为公认的解决办法予以标记。 – gpmcadam 2012-07-18 12:45:37

+1

这应该是在PHP文档... – Tjorriemorrie 2013-02-06 16:21:12

2

假设的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)

+0

感谢您的帮助;我确实忘记了'回归'......嘿嘿 – TheOddLinguist 2010-05-03 21:36:22

4

eval()将努力为这个完美的罚款,但请记住,你必须告诉它返回的东西。

​​

此外,请确保您清理任何用户输入,如果直接将它们放入eval()

+0

谢谢;我忘记了'回归'。字符串是一个相当紧密的正则表达式的结果,所以我认为我会没事的。现在我将重新评估这种消毒方式的效果。再次感谢。 – TheOddLinguist 2010-05-03 21:36:04

-3

(串),正确& &真正||假