2010-05-03 13 views
9

Estoy construyendo una clase PHP con una función miembro privada que devuelve un valor de cadena, tales como:Cómo analizar una cadena de lógica booleana en PHP

'true && true || false' 

a una función miembro pública. (Esta cadena es el resultado de algunas coincidencias de expresiones regulares y búsquedas de propiedades.) Lo que me gustaría hacer es hacer que PHP analice la lógica devuelta y que devuelva la función pública mencionada anteriormente si el resultado booleano de la lógica analizada es verdadero o falso.

He intentado con eval(), pero no obtengo ningún resultado. Intenté encasillar los retornos booleanos ... pero no hay forma de encasillar operadores ... jeje ¿Alguna idea? (Avíseme si necesita más información.)

+1

¿Has probado eval ("return". $ Mystring)? – Jasper

Respuesta

28

Acabo de tropezar con esta pregunta, pero al estar bastante incómodo con el uso de eval, decidí seguir buscando una solución mejor.

Lo que descubrí es otro uso maravilloso para la función filter_var de PHP, al pasar en el indicador FILTER_VALIDATE_BOOLEAN (of which there are many).

Esta función de "una línea" parece hacerlo bien en segura convertir una cadena (u otro) objeto a un valor lógico:

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

Y, un poco de prueba:

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

} 

salida:

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

No he buscado lo suficientemente profundo, pero es posible que esta solución dependa de eval en algún lugar, sin embargo, aún así me gustaría usar las más sencillas eval ing ya que supongo que filter_var también manejaría desinfectar cualquier entrada antes de conectarla a través de eval.

+3

Esto realmente no resuelve el problema original (en el sentido de que no se manejan los operadores). 'filter_var ('true && true', FILTER_VALIDATE_BOOLEAN)' devuelve 'false'. –

+4

Absolutamente. Esto fue un malentendido de la pregunta original de mi parte, y no debe marcarse como la solución aceptada. – gpmcadam

+1

Esto debería estar en los documentos php ... – Tjorriemorrie

2

Supongamos que eval() es una solución correcta/buena en su 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); 

impresiones bool(true)

+0

Gracias por su ayuda; De hecho estaba olvidando el 'retorno' ... jeje – TheOddLinguist

4

eval() funcionarán perfectamente bien para esto, pero recuerde que usted tiene que decirle a devolver algo.

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

También asegúrese de desinfectar las entradas del usuario si ponerlos directamente en un eval().

+0

Gracias; Me estaba olvidando el 'retorno'. La cuerda es el resultado de una expresión regular bastante ajustada, así que creo que estaré bien. Voy a volver a evaluar la desinfección ahora que esto está funcionando. Gracias de nuevo. – TheOddLinguist

-3

(cadena) true & & true || falso

Cuestiones relacionadas