2015-09-23 125 views
0

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])))\.?$ 

這是正確的正則表達式這也驗證了電子郵件地址的域部分,如:

[email protected]

將有效,並且格式與第一個示例類似的電子郵件地址現在將無效。

發生什麼事是,當使用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 並在湯姆接受的答案中,他說他不會這樣做,但不是爲什麼他不會。那麼,爲什麼要避免這樣的解決方案呢?我只是好奇這裏的「最佳做法」是什麼。

+0

請注意,jQuery驗證引擎是一個完全不同的插件。已編輯的標籤。 – Sparky

回答

1

這是validate()插件的已知錯誤嗎?

NO

這不是一個錯誤。


這是對這一問題的可接受的解決方案?我問的原因是我檢查了這個問題:覆蓋jquery驗證插件的電子郵件地址驗證,並在湯姆接受的答案,他說,他不會這樣做,但不是他爲什麼不會。那麼,爲什麼要避免這樣的解決方案呢?我只是好奇這裏的「最佳做法」是什麼。

只要內置在插件中的方法沒有按照您的意願執行,您就可以簡單地創建自己的自定義方法並使用它。這樣做絕對沒有錯,這正是爲什麼你可以使用.addMethod()方法。

我的猜測是,湯姆只是說他會堅持內置到插件中的電子郵件驗證(就像我),而不是創建一個新的;我幾乎可以肯定,他並不是說在創建新的規則/方法時總會出現任何問題。

+0

但是插件附帶的驗證不起作用,至少不是我想要的方式。 –

+0

@CarlEriksson,??我的回答清楚地表明你所做的是完全可以接受的。 – Sparky

+0

是的,我只是提到這一行「我的猜測是,湯姆只是表示他會堅持內置在插件中的電子郵件驗證(我會這樣做),而不是創建一個新的;」 –

相關問題