2010-05-03 12 views
9

Sto costruendo una classe PHP con una funzione di membro privata che restituisce un valore stringa come:come analizzare una serie di logica booleana in PHP

'true && true || false' 

a una funzione membro pubblica. (Questa stringa è il risultato di alcune corrispondenze di espressioni regolari e ricerche di proprietà.) Quello che mi piacerebbe fare è che PHP analizzi la logica restituita e restituisca la funzione pubblica sopra riportata se il risultato booleano della logica analizzata è vero o falso.

Ho provato eval(), ma non ottengo alcun output. Ho provato a digitare i ritorni booleani ... ma non c'è modo di usare gli operatori typecast ... hehe Qualche idea? (Fammi sapere se hai bisogno di ulteriori informazioni.)

+1

hai provato eval ("return". $ Mystring)? – Jasper

risposta

28

Appena inciampato su questa domanda, ma essendo piuttosto a disagio nell'usare eval, ho deciso di continuare a cercare una soluzione migliore.

Quello che ho scoperto è ancora un altro uso meraviglioso per la funzione PHP filter_var, quando si passa il flag FILTER_VALIDATE_BOOLEAN (of which there are many).

Questa funzione "una linea" sembra fare bene a sicurezza conversione di una stringa (o altro) oggetto per un valore booleano:

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

E, un po 'di 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"; 

} 

uscita:

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

Non ho guardato abbastanza in profondità, ma è possibile che questa soluzione si basi su eval da qualche parte, tuttavia mi piacerebbe ancora utilizzare quelli in chiaro eval poiché presumo che lo filter_var gestisca anche la sanitizzazione di qualsiasi input prima di collegarlo attraverso eval.

+3

Questo non risolve il problema originale (in quanto gli operatori non sono gestiti). 'filter_var ('true && true', FILTER_VALIDATE_BOOLEAN)' restituisce 'false'. –

+4

Assolutamente. Questo è stato un fraintendimento della domanda originale da parte mia e dovrebbe essere privo di contrassegni come soluzione accettata. – gpmcadam

+1

Questo dovrebbe essere nei documenti php ... – Tjorriemorrie

2

Supponiamo che eval() sia una soluzione ok/buona nel tuo caso.

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

stampe bool(true)

+0

Grazie per il vostro aiuto; Stavo davvero dimenticando il "ritorno" ... hehe – TheOddLinguist

4

eval() funzionerà perfettamente bene per questo, ma ricordati che devi dirgli di restituire qualcosa.

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

Inoltre, assicurarsi di validare qualsiasi input dell'utente se mettendoli direttamente in un eval().

+0

Grazie; Stavo dimenticando il "ritorno". La corda è il risultato di una regex piuttosto stretta, quindi penso che starò bene. Riesaminerò l'igienizzazione ora che funziona. Grazie ancora. – TheOddLinguist

-3

(stringa) true & & true || false

Problemi correlati