我建立一個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