[英]string => number conversion in JS
我有一个URL,我在哈希之后进行解析。 哈希之后的内容是一个数学方程式(例如http://example.com/something#5+1 ),我想找到它的和(或任何其他方程式的结果,例如乘积,除法等) )
我可以使用以下方法检索数字:
var url = (window.location.hash).substr(1) // returns "5+1" as a string
虽然我发现如果尝试将其转换为数字,但实际上并没有进行数学运算。 它将其缩减为5,而不是显示8之和。
这种转换可能吗?
谢谢!
不要从URL中eval()
任意代码,因为它很容易被XSS利用。 我创建了一个名为JSandbox的库,该库可以对JavaScript代码执行进行沙箱处理,但是它需要Web工作者的支持。 对IE使用伪造的工人支持不是一个好主意,因为沙盒的安全性已荡然无存。
您的代码将如下所示:
JSandbox.eval("with(Math){" + location.hash.substr(1) + "}", function (res) {
// handle the results here
});
使用它还可以处理错误:
JSandbox.eval("with(Math){" + location.hash.substr(1) + "}", function (res) {
// handle the results here
}, null, function (err) {
// handle errors here
});
我包括了一个with (Math) { ... }
包装器,因此哈希码可以短时间访问Math函数。 (例如abs(..)
而不是Math.abs(..)
)
eval()
是执行计算的最简单方法,但是您肯定要验证输入是否正确:
var input = window.location.hash.substr(1);
var result = null;
try {
// Make sure the input is only numbers and supported operators.
if (/^[-+*/.()0-9]+$/.test(input))
result = eval(input);
} catch (ex) {
// Insert error handling here...
}
此正则表达式应过滤掉任何危险的输入。
为了真正正确地做到这一点,您需要为您的数学表达式语言编写一个简单的解析器。 据称这不是很困难,但我本人却从未能够做到。 这是使javascript正确评估和正确解释数学表达式的唯一方法,而无需同时打开pandoras框,并让所有讨厌的东西像对eval()的简单(愚蠢)调用一样通过。
或者,您可以四处看看,找到已经做到这一点的人,例如:
要执行字符串,请参见eval ,某些不执行此操作的原因在why-is-using-javascript-eval-function-a-bad-idea处 。
这意味着在任何重要的代码中-来自不可信来源(例如Internet)的数据-您都应该解析出数字和数学运算...而不能接受任何其他类型的输入。
var code = "5+1";
var result = window.eval(code);
但是,就像所有具有评估功能的语言一样,请谨慎评估。
function CalculateString(hash) {
var ReturnValue;
var patt = '([\d*+-/.%])';
ReturnValue = hash.match(patt)[1];
ReturnValue = eval(ReturnValue);
if (ReturnValue > 0) {
return parseInt(ReturnValue,10);
} else {
return 0;
}
}
所以你可以这样:
var Hash = (window.location.hash).substr(1);
var Calculation = CalculateString(Hash); // Retinerer result of the calculation if it is valid, otherwise it will give you 0.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.