2008-11-29 21 views
7

Tengo la necesidad de evaluar expresiones lógicas definidas por el usuario de complejidad arbitraria en algunas páginas PHP. Suponiendo que los campos del formulario son las variables primarias, sería necesario:Análisis/análisis de expresiones lógicas dinámicas en PHP?

  • sustituto "varibles" de forma valores de los campos;
  • operadores de comparación asa, mínimamente ==, <, < =,> = y> por símbolo, el nombre (por ejemplo, eq, lt, le, ge, gt respectivamente);
  • manejar operadores booleanos no, AND, OR y posiblemente xor por nombre, símbolo (por ejemplo, & &, || y ^^ respectivamente!);
  • maneja los valores literales para las cadenas y números;
  • ser texto sin formato no XML (por ejemplo, "nombre == '' o apellido == ''), y
  • ser razonablemente performant

Ahora en los años pasados ​​he escrito analizadores descendente recursivo. que podría construir un árbol de expresiones y hacer este tipo de cosas, pero esa no es una tarea que disfruto en PHP, así que espero que haya cosas que me ayuden a conseguirlo.

Sugerencias ?

+2

¿Puedo preguntar, se las arregló para crear una función para analizar la expresión sencilla sin necesidad de utilizar eval? – buggedcom

Respuesta

3

Verificar create_function, crea una función anónima a partir de los parámetros de cadena pasados, no estoy seguro de su rendimiento, pero es muy flexible ...

+0

Ooooo agradable. No soy experto en PHP, así que no estaba al tanto de create_function. Gracias por eso. – cletus

+1

Es bueno tener en cuenta que está en desuso a partir de PHP 7.2.0 –

1

Si entiendo el problema correctamente, quiere que los usuarios escriban funciones en non -PHP, y luego tiene PHP interpretarlo?

Si es así, simplemente puede tomar su cadena y reemplazar "lt" con "<" y "gt" con ">" ... luego hacer eval().

Tengo la corazonada de que el problema no es tan simple, pero si lo es, eval() podría hacer el trabajo. Por supuesto, entonces te estás abriendo para cualquier tipo de ataque.

+0

Gracias por la respuesta. La respuesta puede ser así de simple. No soy un experto en PHP Java es más mi schtick. Ninguna de estas expresiones proviene del mundo exterior. Es toda la configuración interna. – cletus

+0

problema con 'eval' es que ejecuta código PHP arbitrario que se le pasa. Tradicionalmente ha habido un problema con los ataques de inyección. es decir, los usuarios pueden pasar el código que se conectará y ejecutará en el mismo entorno que el código de producción. Dependiendo de la astucia o malicia del usuario, ese código puede causar estragos y efectos secundarios no deseados. Tendría que ser muy cuidadoso e inteligente en su comprobador/sustituto para poder filtrar todos los problemas potenciales dentro de PHP arbitrario. – Dennis

0

Eche un vistazo a my infix to postfix example Creo que podría exportarlo a PHP con relativa facilidad. Solo usa una matriz y algunos modificadores. Sin árboles Solo se necesita una pila para ejecutar el resultado del postfijo.

0

Usted puede tratar de adaptar mi clase Evaluador (https://github.com/djfm/Evaluator), que hace expresiones aritméticas (por ahora) y se puede utilizar variables también. Todos los principales operadores PHP están implementados.

5

Mucho tiempo ha pasado desde que se hizo esta pregunta, y estaba buscando un analizador de expresiones para php. Elegí usar el componente ExpressionLanguage de Symfony 2.4. Se puede instalar sin dependencias del compositor a través del packagist.

composer require symfony/expression-language

+1

Evalué casi todos los ExpressionParsers mencionados aquí en stackoverflow y google. Terminé usando este. – larrydahooster

Cuestiones relacionadas