Estación de clasificación aplicación en PHP necesario, interpretar y analizar una cadena realizar una comparación matemática y devuelve un resultado booleano

StackOverflow https://stackoverflow.com/questions/3664017

Pregunta

Estoy buscando algo que puede interpretar una cadena en PHP y realizar cálculos matemáticos sencillos, y luego devolver un resultado booleano de si la expresión es verdadera o falsa.

Por ejemplo:

  1. tipos Sue en "3 * {mysalary} / 9 = 10.000"
  2. PHP divide este en dos expresiones - explote ( '=', cadena);
  3. PHP toma mi lista de campos de la base, y reemplaza cualquier "{}" campos delimitados con los datos (typecasted a int)
  4. PHP entonces evalúa la expresión matemáticas
  5. php compara entonces el lado izquierdo hacia el lado derecho
  6. resultado booleano produce.

Puede parecer complejo, pero sólo tiene que ser muy simple. Estas son las limitaciones: 1 los operadores / matemáticas se fijan a: + - / * operadores 2 / comparación se fijan a: => <> = <= 3 / no comparaciones en coma flotante necesitar, todo se puede hacer en un nivel entero. Por lo que cualquier divisiones pueden redondearse si es necesario o simplemente a la vuelta el resultado final

No siempre será solamente dos expresiones, con un operador de comparación. Si hay algún tipo de error en absoluto nos limitaremos a devolver false.

Alguien ha visto algo que puede hacer esto ya? Sé que puedo hacer algo, pero ¿por qué reinventar la rueda derecha?

Si usted no ha visto nada te importa enumerar algunas "GOTCHA" o salvedad de que se puede pensar en la construcción de este.

Después de leer algunos más que darse cuenta de que podía usar el derivación algoritmo patio . ¿Alguien tiene una implementación de este en PHP?

Soy consciente de la función eval podría ser un método fácil de realizar esto, sin embargo, me preocupa que el usuario podría fácilmente romper algo uso de este método o causar errores de sintaxis. Yo prefiero no incluyo en la solución, o si lo hago entonces había necesidad de controlar de cerca la forma en que se utiliza.

Gracias.

Jason

¿Fue útil?

Solución

Tome un vistazo a la evalMath clase de PHPClasses. Esto debería hacer casi todo lo que desea, incluyendo la sustitución de variables (como la fijación de un valor para "mysalary" en su ejemplo antes de evaluar la expresión)

Otros consejos

Hay un motor analizador expresión (implementaciones para JavaScript + Nodo , PHP , Python y ActionScript) , en la github Xpresion (ps. soy el autor)

El motor es bastante flexible y configurable, uno puede crear programas de análisis que analizan cualquier expresión que también incluye las variables definidas por el usuario , funciones definidas por el usuario , polimórficas operadores y generales n-ary operadores (por ejemplo. ternario if-then-else )

El algoritmo es bastante general (se podría decir, una variación generalizada de Estación de clasificación algoritmo )

El enfoque que tomaría es:

  1. Tokenize la expresión
  2. Analizar en un árbol de sintaxis abstracta
  3. Realizar sustituciones de variables (ver ansiosos evaluación )
  4. Calcular el resultado

Ahora ...

  • El algoritmo de playa de vías es una manera de hacer los pasos 1 y 2.
  • Puede comprobar si la expresión es sintácticamente correcta después de la segunda etapa
  • ¿Cómo se calcula el resultado dependerá de cómo se construye la AST.

El paso más difícil es la segunda; usted tiene que considerar la precedencia de operadores, paréntesis, y otras cosas, pero hay un montón de literatura sobre la que (incluso se puede simplemente seguir ese enlace Wikipedia)

¿por qué no sólo tiene que realizar sustituciones de variables, y luego hacer un preg_replace("/[^0-9+-*\/]/", '', $inputString), y luego utilizar cualquiera eval() o create_function()? Si se utiliza este DEBE asegurarse de que "declaraciones" que posiblemente sean inseguras se eliminan, por eso yo solía preg_replace, por lo que sería eliminar cualquier cadena literal

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top