with tipos significado pasar parametros funciones evaluacion entre alternativa javascript parsing math

tipos - pasar variables entre funciones javascript



Evaluación segura de expresiones aritméticas en Javascript (5)

Necesito evaluar expresiones aritméticas ingresadas por el usuario como "2 * (3 + 4)" en Javascript pero no quiero usar eval por razones de seguridad.

Podría quitar todos los caracteres que no son números u operadores, pero no estoy seguro de que esto sea seguro de todos modos y sería bueno si el usuario pudiera usar funciones como cos , sqrt , etc ...

¿Hay alguna biblioteca de Javascript que realice evaluación de expresiones aritméticas?


Como ya se mencionó, el mayor daño que cualquier usuario podría hacer es más o menos lo que ya podría hacer usando la consola integrada en cualquiera de los principales navegadores. Sin embargo, si quisiera restringir al usuario a usar propiedades / métodos Math , podría escribir una expresión regular simple para manejar esto por usted. Algo como esto debería funcionar:

function mathEval (exp) { var reg = /(?:[a-z$_][a-z0-9$_]*)|(?:[;={}/[/]"''!&<>^//?:])/ig, valid = true; // Detect valid JS identifier names and replace them exp = exp.replace(reg, function ($0) { // If the name is a direct member of Math, allow if (Math.hasOwnProperty($0)) return "Math."+$0; // Otherwise the expression is invalid else valid = false; }); // Don''t eval if our replace function flagged as invalid if (!valid) alert("Invalid arithmetic expression"); else try { alert(eval(exp)); } catch (e) { alert("Invalid arithmetic expression"); }; }

Me doy cuenta de que no quería usar eval por razones de seguridad, pero la expresión regular debería hacerlo bastante seguro ya que descarta las palabras que no son propiedades directas del objeto Math y la mayoría de los operadores JS no matemáticos, incluido el operador de asignación. ( = ) y operadores binarios. El método más difícil sería escribir un tokenizador para analizar la expresión matemática, porque no es un lenguaje regular.

Siéntete libre de probar y romper el ejemplo de trabajo que escribí, si puedes o si notas un problema, deja un comentario y veré qué puedo hacer para solucionarlo.

Nota: Yi Jiang mencionó en el chat de JavaScript que también podría ser útil permitir minúsculas para cosas como Math.PI Si ese es el caso, puede agregar la siguiente declaración else if en la función de reemplazo:

else if (Math.hasOwnProperty($0.toUpperCase()) return "Math."+$0.toUpperCase();

Agréguelo entre la instrucción if y else ( ejemplo ).


Puede usar una expresión regular para reemplazar todo excepto su lista blanca. Pero dado que javascript se ejecuta en el cliente (a menos que esté ejecutando el servidor http de AOL), cualquiera que pueda modificar las entradas también puede modificar el código, por lo que realmente no lo hace más o menos seguro de lo que ya es .


puedes probar JavaScript Expression Evaluator :

Esta biblioteca es una versión modificada del analizador de expresiones ActionScript de Raphael Graf. Cuando escribí el JavaScript Function Plotter, quería una mejor alternativa para usar la función de evaluación de JavaScript . No existe riesgo de seguridad actualmente, ya que solo puede ejecutar código en su propio navegador, pero no es tan conveniente para matemáticas (Math.pow (2 ^ x) en lugar de 2 ^ x, etc.).

entonces tu código será así:

console.info ( Parser.evaluate( "2 * (3 + 4)" ) ); //prints 14


Puede usar el analizador de expresiones avanzadas de math.js, que no usa la evaluación de JavaScript.

http://mathjs.org

Uso:

var ans = math.eval(''2 * (3 + 4)'');

o use el analizador (que admite asignaciones de variables y funciones):

var parser = math.parser(); var ans = parser.eval(''2 * (3 + 4)'');


Prueba nerdamer

var result = nerdamer(''sqrt(4)+cos(1)-2'').evaluate(); document.getElementById(''text'').innerHTML = result.text();

<script src="http://nerdamer.com/js/nerdamer.core.js"></script> <div id="text"></div>