2010-05-03 71 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

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