2010-05-03 4 views
9

Ich baue eine PHP-Klasse mit einer privaten Member-Funktion, die einen String-Wert zurückgibt, wie:Wie eine Reihe von Booleschen Logik in PHP analysieren

'true && true || false' 

zu einer öffentlichen Member-Funktion. (Dieser String ist das Ergebnis einiger Regex-Matching- und -Eigenschaften-Lookups.) Was ich tun möchte, ist, dass PHP die zurückgegebene Logik analysiert und die zuvor erwähnte öffentliche Funktion zurückgibt, ob das boolesche Ergebnis der geparsten Logik wahr oder falsch ist.

Ich versuchte Eval(), aber ich bekomme überhaupt keine Ausgabe. Ich habe versucht, die booleschen Returns zu tippen ... aber es gibt keine Möglichkeit, Operatoren zu tippen ... hehe Irgendwelche Ideen? (Lassen Sie es mich wissen, wenn Sie weitere Informationen benötigen.)

+1

hast du eval versucht ("return". $ Mystring)? – Jasper

Antwort

28

Gerade auf diese Frage stolperte, aber ziemlich unbehaglich über die Verwendung von eval, entschied ich mich, weiter nach einer besseren Lösung zu suchen.

Was ich entdeckte, ist noch eine andere wunderbare Verwendung für PHP filter_var Funktion, wenn Sie die FILTER_VALIDATE_BOOLEAN Flag (of which there are many) übergeben.

Diese "eine Zeile" Funktion scheint bei sicher Umwandlung eine Zeichenfolge (oder anderes) Objekt zu einem boolean gut zu tun:

<?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); 
} 

Und ein kleinen Test:

/** 
* 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"; 

} 

Ausgang:

/* 
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) 
*/ 

Ich habe nicht tief genug geschaut, aber es ist möglich, dass diese Lösung auf eval irgendwo auf der Linie beruht, aber ich würde immer noch mit der Verwendung von über eval inging, da ich davon ausgehe, dass filter_var auch die Bereinigung jeglicher Eingabe vor dem Verrohrung durch eval.

+3

Dies löst nicht wirklich das ursprüngliche Problem (in dem Operatoren nicht behandelt werden). 'filter_var ('true && true', FILTER_VALIDATE_BOOLEAN)' gibt 'false' zurück. –

+4

Absolut. Dies war ein Missverständnis der ursprünglichen Frage von mir und sollte nicht als akzeptierte Lösung markiert werden. – gpmcadam

+1

Dies sollte in der PHP-Dokumentation sein ... – Tjorriemorrie

2

Nehmen wir an, eval() ist in Ihrem Fall eine gute Lösung.

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); 

druckt bool(true)

+0

Danke für Ihre Hilfe; Ich habe tatsächlich die 'Rückkehr' vergessen ... hehe – TheOddLinguist

4

eval() wird für diese perfekt funktionieren, aber erinnern Sie sich, es zu sagen, etwas zurück.

$string = "true && true || false"; 
$result = eval("return (".$string.");"); // $result will be true 

Auch stellen Sie sicher, dass alle Benutzereingaben sanieren, wenn sie direkt in eine eval() setzen.

+0

Danke; Ich habe die Rückkehr vergessen. Die Saite ist das Ergebnis einer ziemlich engen Regex, also denke ich, dass es mir gut gehen wird. Ich werde das Desinfizieren neu bewerten, sobald es funktioniert. Danke noch einmal. – TheOddLinguist

-3

(Zeichenfolge) true & & true || false