2010-05-03 11 views
9

Je construis une classe PHP avec une fonction parlementaire qui renvoie une valeur de chaîne telle que:Comment analyser une chaîne de la logique booléenne en PHP

'true && true || false' 

à une fonction de membre du public. (Cette chaîne est le résultat de certaines recherches d'expressions rationnelles et de propriétés.) Ce que je voudrais faire, c'est que PHP analyse la logique retournée et que la fonction publique mentionnée retourne si le résultat booléen de la logique analysée est vrai ou faux.

J'ai essayé eval(), mais je n'ai aucune sortie du tout. J'ai essayé de typer les retours booléens ... mais il n'y a aucun moyen de typer les opérateurs ... hehe Des idées? (Faites-moi savoir si vous avez besoin de plus d'informations.)

+1

avez-vous essayé eval ("return". $ Mystring)? – Jasper

Répondre

28

Je suis tombé sur cette question, mais étant plutôt mal à l'aise avec l'utilisation de eval, j'ai décidé de continuer à chercher une meilleure solution.

Ce que je découvre est encore une autre merveilleuse utilisation de la fonction PHP filter_var, lors du passage dans le drapeau FILTER_VALIDATE_BOOLEAN (of which there are many).

Cette fonction "une ligne" semble bien faire à en toute sécurité conversion d'une chaîne (ou autre) objet à un booléen:

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

Et, un peu de tests:

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

} 

sortie:

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

Je n'ai pas regardé assez loin, mais il est possible que cette solution repose sur la ligne quelque part, mais je serais encore d'côté avec l'utilisation de eval car je suppose que filter_var gérerait également la désinfection de toute entrée avant de l'envoyer à eval.

+3

Cela ne résout pas vraiment le problème d'origine (en ce sens que les opérateurs ne sont pas gérés). 'filter_var ('true && true', FILTER_VALIDATE_BOOLEAN)' retourne 'false'. –

+4

Absolument. C'était une mauvaise compréhension de la question initiale de ma part et je ne devrais pas la considérer comme la solution acceptée. – gpmcadam

+1

Cela devrait être dans les documents php ... – Tjorriemorrie

2

Supposons que eval() est une bonne solution dans votre cas.

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

impressions bool(true)

+0

Merci pour votre aide; J'oubliais en effet le 'retour' ... hehe – TheOddLinguist

4

eval() fonctionnera parfaitement pour cela, mais rappelez-vous que vous avez à dire à retourner quelque chose.

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

Assurez-vous également des entrées désinfectez utilisateur si les mettre directement dans un eval().

+0

Merci; J'oubliais le 'retour'. La chaîne est le résultat d'une regex plutôt serrée, donc je pense que ça ira. Je vais réévaluer la désinfection maintenant que cela fonctionne. Merci encore. – TheOddLinguist

-3

(chaîne de caractères) true & & true || false