如何清理JS eval输入?

时间:2011-05-14 01:44:31

标签: javascript eval

a="79 * 2245 + (79 * 2 - 7)";
b="";
c=["1","2","3","4","5","6","7","8","9","0","+","-","/","*"];
for (i=1;i<a.length;i++){
  for (ii=1;i<c.length;i++){
    b=(a.substring(0,i))+(c[ii])+(a.substring(i+1,a.length));
    alert(eval(b.replace(" ","")));
  }
}

我需要找出如何使它成为当我使用eval时,我知道输入不会停止脚本,如果它通常会使脚本崩溃而忽略它。我知道eval不是一个很好用的功能,但我想要一个快速简单的方法来解决这个问题。上面的代码尝试输出所有答案,其中包含上述任何数字,符号或空格的所有可能替换。 i表示它在字符串中的距离,ii表示它当前正在检查的符号。 a是原始问题,b是修改过的问题。

2 个答案:

答案 0 :(得分:2)

尝试捕获eval可能抛出的异常,如下所示:

try{
  alert(eval(b.replace(" ","")));
} catch (e){
  //alert(e);
}

答案 1 :(得分:1)

您可以检查一些特殊情况并避免使用正则表达式等行为,但绝对没有办法'如果它通常会崩溃只是忽略它'

这就像停止问题一样,就像mellamokb所指的那样。除了运行脚本之外,还没有办法知道脚本运行完毕。

一个人应该非常小心地审查转到eval的任何字符串,并尽可能多地保留用户输入,除了真正的简单和可验证的东西,如整数值。如果你能找到一个方法eval,那就更好了。

对于计算示例,您可能最好将其正确地解析为标记并从那里开始而不是以字符串形式进行评估。

PS - 如果你真的想在a中查看这些一次性的表达式,那么eval使用{{1}}就会有一些有趣的用法。你能解释为什么你在评估之前立即修剪空白吗?我不相信我能想到它影响结果的情况。对于(至少大多数)有效的表达式,它没有任何区别,虽然它可能会改变一些无效的情况但我不能想到它有效地表达的情况