【发布时间】:2015-07-04 07:36:57
【问题描述】:
我有一个这样的字符串:
var data ="(1+2*(3+2))";
我正在尝试解析字符串,以获得适当的结果。但我仍然没有得到任何解决方案,任何想法?
预期结果 = 11
【问题讨论】:
标签: javascript jquery
我有一个这样的字符串:
var data ="(1+2*(3+2))";
我正在尝试解析字符串,以获得适当的结果。但我仍然没有得到任何解决方案,任何想法?
预期结果 = 11
【问题讨论】:
标签: javascript jquery
试试
var result = eval(data);
虽然 eval 可能是邪恶的,但并非总是如此
【讨论】:
只要你100%确定输入绝对安全,就可以直接使用eval:
var data ="(1+2*(3+2))";
var res = eval(data);
但是,如果您不信任输入,您可以考虑寻找不同的解决方案(仍然使用 eval),就像用户 Kennebec 在此处提出的那样:
或者更好的是,您可以考虑使用第三方库,例如 mathjs:
你不应该使用 eval 的原因其实有很多,但只要你确定你可以控制你的输入流并且你绝对确定用户不能使用 eval 任何 evil 你也可以安全地使用 eval 范围。
无论如何,因为 mathjs 存在,如果你需要进一步计算我个人推荐你 mathjs。
在 mathjs 的情况下,代码应该是这样的:
var data ="(1+2*(3+2))";
var res = math.eval(data);
小提琴: http://jsfiddle.net/jLxkn7no/
另外,附带说明一下,要使用 mathjs 库,您只需包含一个脚本,它可以作为 cdn 使用: http://cdnjs.com/libraries/mathjs
编辑:
如果您不是 DL;DR;读者,请随意阅读以下内容:
如果你好奇普通的eval()mathjs的eval有什么区别,这里是直接取自源代码的sn-p:
/**
* Parse and evaluate the given expression
* @param {String} expr A string containing an expression, for example "2+3"
* @return {*} result The result, or undefined when the expression was empty
* @throws {Error}
*/
Parser.prototype.eval = function (expr) {
// TODO: validate arguments
return _parse(expr)
.compile(math)
.eval(this.scope);
};
和_parse:
/**
* Parse an expression. Returns a node tree, which can be evaluated by
* invoking node.eval();
*
* Syntax:
*
* parse(expr)
* parse(expr, options)
* parse([expr1, expr2, expr3, ...])
* parse([expr1, expr2, expr3, ...], options)
*
* Example:
*
* var node = parse('sqrt(3^2 + 4^2)');
* node.compile(math).eval(); // 5
*
* var scope = {a:3, b:4}
* var node = parse('a * b'); // 12
* var code = node.compile(math);
* code.eval(scope); // 12
* scope.a = 5;
* code.eval(scope); // 20
*
* var nodes = math.parse(['a = 3', 'b = 4', 'a * b']);
* nodes[2].compile(math).eval(); // 12
*
* @param {String | String[] | Matrix} expr Expression to be parsed
* @param {{nodes: Object<String, Node>}} [options] Available options:
* - `nodes` a set of custom nodes
* @return {Node | Node[]} node
* @throws {Error}
*/
math.parse = function parse (expr, options) {
return _parse.apply(_parse, arguments);
}
};
【讨论】: