我在使用正则表达式进行自定义验证时遇到问题。
我有一个不引人注目的方法:
jQuery.validator.addMethod("isRegex", function (value, element, params) {
if (value.length < 1) return true;
var re = new RegExp(params.regex);
var match = re.exec(value);
return match;
});
起初,我使用这个正则表达式来验证电子邮件表单字段:
^\w+([-+.]*[\w-]+)*@(\w+([-.]?\w+)){1,}\.\w{2,4}$
该事件将被“onkeyup”触发,一开始它会起作用,但如果电子邮件地址太长,则会导致浏览器挂起,唯一的恢复方法是重新启动浏览器。这种情况发生在 IE 和 Chrome 上,但也可能发生在 Firefox 上。
例如输入“[电子邮件受保护] /cdn-cgi/l/email-protection“会很好的。”[电子邮件受保护] /cdn-cgi/l/email-protection“ 也可以毫无问题地工作,但是“测试测试[电子邮件受保护] /cdn-cgi/l/email-protection" 将挂在最后一个字母上。
起初我认为正则表达式可能效率低下,导致无限循环或锁定,所以我将其更改为简单的东西:
^.+@.+\..+$
部分成功,我可以输入更长的电子邮件地址,但它最终仍然挂起。
然后我想我应该禁用 onkeyup 事件,也许只是验证模糊,为此我使用了:
$("#divEmail input[data-val-fieldregex]").keyup(function () { return false; });
现在键盘被禁用,但浏览器挂起模糊,所以这意味着代码:
var re = new RegExp(params.regex);
var match = re.exec(value);
必须无法处理大值。
有任何想法吗?