JQuery.Validate用于验证电子邮件地址的内置方法如下所示:
return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
此正则表达式将下面的电子邮件地址作为有效
传递testMail @测试
在我的模型中,我使用数据类型属性[EmailAddress]
生成以下正则表达式:
^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$
这是正确的Regex,它也验证了电子邮件地址的域名部分,例如:
testMail@test.correct
将有效,格式化为第一个示例的电子邮件地址现在将无效。
当使用jQuery.validate的正则表达式(默认值)发布表单时,即使将电子邮件地址格式化为第一个示例,它也会将表单设置为有效。发布的表单数据将传递到服务器端,检测到无效的电子邮件格式并引发错误。这是validate()插件的已知错误吗?因为我似乎无法在 bugreport部分(http://bugs.jquery.com/search?ticket=on&q=validate+email&page=3&noquickjump=1)中找到关于此的票证。我也尝试将jQuery.validate从1.13更新到1.14,但正则表达式在两个版本中都是相同的。
无论如何,我发现的解决方案是通过添加自定义规则来扩展验证插件:
var validCustomRegex = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/;
var custEmailValidationMessage;
$.validator.addMethod('customemail', function (value, element) {
custEmailValidationMessage = $(element).data("val-regex");
return this.optional(element) || validCustomRegex.test(value);
}, custEmailValidationMessage);
然后调用我的自定义函数而不是默认电子邮件:
$(form).validate({somecode});
$(form).find("input[type='email']").each(function () {
var requiredMessage = $(this).data("validationmessage");
var invalidFormatMessage = $(this).data("val-regex");
var $self = $(this);
$self.rules('add', {
customemail: true,
messages: {
required: requiredMessage,
email: invalidFormatMessage
}
});
});
对于这个问题,这是否是可接受的解决方案?我问的原因是我检查了这个问题:override jquery validate plugin email address validation 在汤姆接受的答案中,他说他不会这样做,但不是他为什么会这样做。那么为什么要避免像这样的解决方案呢?我只是好奇最新的做法"最佳做法"这里。
答案 0 :(得分:1)
这是validate()插件的已知错误吗?
否强>
这不是一个错误。
jQuery Validate v1.12.0 Changelog:"方法:更新电子邮件以使用HTML5 正则表达式,删除email2方法"
Validate Format of an Email Address using Jquery.validate.js
How does HTML5 input type email works without top level domain name
请参阅http://en.wikipedia.org/wiki/Email_address#Domain_part 有效电子邮件地址的示例。
对于这个问题,这是否是可接受的解决方案?我问的原因是我检查了这个问题:覆盖jquery验证插件电子邮件地址验证,在汤姆接受的答案中,他说他会这样做,但不是为什么他会这样做#39 ; NT。那么为什么要避免像这样的解决方案呢?我只是好奇最新的做法"最佳做法"这里。
是强>
每当插件内置的方法无法按照您的意愿执行时,您只需创建自己的自定义方法并使用它。这样做绝对没有错,这正是您可以使用.addMethod()
方法的原因。
我的猜测是,汤姆只是意味着他会坚持使用内置于插件中的电子邮件验证(就像我一样),而不是创建一个新的;我几乎可以肯定他并不是说创建新规则/方法总体上有任何问题。