JQuery.Validate內置的用於驗證電子郵件地址的方法是這樣的:JQuery.validate()通過電子郵件地址無效域格式爲有效
return this.optional(element) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-][email protected][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 @測試
在我的模型我使用的數據類型ATT ribute [EmailAddress]
這genererates以下正則表達式:
^((([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])))\.?$
這是正確的正則表達式這也驗證了電子郵件地址的域部分,如:
將有效,並且格式與第一個示例類似的電子郵件地址現在將無效。
發生什麼事是,當使用jQuery.validate的正則表達式(默認值)發佈表單時,它將表單設置爲有效,即使電子郵件地址格式化爲第一個示例。發佈的表單數據傳遞給服務器端,檢測到無效的電子郵件格式並引發錯誤。這是validate()插件的已知錯誤嗎?因爲我無法在錯誤報告部分(http://bugs.jquery.com/search?ticket=on&q=validate+email&page=3&noquickjump=1)中找到有關此問題的故障單。我也嘗試更新從1.13到1.14的jQuery.validate,但正則表達式在兩個版本中都是相同的。
無論如何,我發現這種情況的解決方案是通過添加自定義規則來擴展驗證插件:
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 並在湯姆接受的答案中,他說他不會這樣做,但不是爲什麼他不會。那麼,爲什麼要避免這樣的解決方案呢?我只是好奇這裏的「最佳做法」是什麼。
請注意,jQuery驗證引擎是一個完全不同的插件。已編輯的標籤。 – Sparky