我编写了一堆代码来获得有效的支出金额条目(32.4554
、234,324.34
等)。我还编写了代码来限制用户输入超过 13 位数字(不包括 .
和 ,
)。
所有这些都在 Firefox 中完美运行。但在 IE 8 中,位数超过 13 后,如果输入字母,Internet Explorer 就会挂起并崩溃!在调试时,我注意到它在正则表达式行上出现错误,但相同的正则表达式工作正常,直到不超过 13 的限制!麻烦各位专家了!让我看到光!
function isIncorrectSpend(cubeCurrencySpend) {
if(!(/^([1-9]*[0-9]*,?[0-9]*)* (\.[0-9]*)?$/.test(cubeCurrencySpend))) {
return true;
}
return false;
}
function isLongerThanThirteenDigits(cubeCurrencySpend) {
cubeCurrencySpend = cubeCurrencySpend.replace(/,/g, "").replace(/\./g, "");
if(cubeCurrencySpend.length>12) {
return true;
}
return false;
}
jQuery("input#minval").keyup( function() {
if(isIncorrectSpend(jQuery("input#minval").val())) {
jQuery("input#minval").val("");
alert("please enter correct spend value");
}
});
jQuery("input#minval").keypress( function(e) {
var code = (e.keyCode ? e.keyCode : e.which);
if(isLongerThanThirteenDigits(jQuery("input#minval").val()) && (code > 47 && code < 58)) {
alert("Please enter a number less than 13 digits");
return false;
}
return true;
});
最佳答案
我很确定这是catastrophic backtracking的情况。你的正则表达式有太多的可能性需要检查,直到它失败。
问题出在这部分
([1-9]*[0-9]*,?[0-9]*)*
而且我很确定它没有按照您的预期进行操作。
这将匹配相同的内容,但会失败得更快:
/^[1-9]*[0-9,]*(\.[0-9]+)?$/
它仍然允许像 1,,,,,,,,.123 这样的东西,但比你的好得多。如果你想禁止这样的事情,你需要明确你的要求。
关于jquery - 使用正则表达式验证货币时 IE 8 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13377022/