JQuery.validate()将无效域格式的电子邮件地址传递为有效

时间:2015-09-23 15:44:00

标签: jquery regex jquery-validate

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 在汤姆接受的答案中,他说他不会这样做,但不是他为什么会这样做。那么为什么要避免像这样的解决方案呢?我只是好奇最新的做法"最佳做法"这里。

1 个答案:

答案 0 :(得分:1)

  

这是validate()插件的已知错误吗?

这不是一个错误。

  

对于这个问题,这是否是可接受的解决方案?我问的原因是我检查了这个问题:覆盖jquery验证插件电子邮件地址验证,在汤姆接受的答案中,他说他会这样做,但不是为什么他会这样做#39 ; NT。那么为什么要避免像这样的解决方案呢?我只是好奇最新的做法"最佳做法"这里。

每当插件内置的方法无法按照您的意愿执行时,您只需创建自己的自定义方法并使用它。这样做绝对没有错,这正是您可以使用.addMethod()方法的原因。

我的猜测是,汤姆只是意味着他会坚持使用内置于插件中的电子邮件验证(就像我一样),而不是创建一个新的;我几乎可以肯定他并不是说创建新规则/方法总体上有任何问题。