[英]Regex: Allow multiple emails separated by ; (semicolon) AND allow blank/empty value
這是我的正則表達式:
var emailsRegex = /^[\W]*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{2,4}[\W]*;{1}[\W]*)*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{2,4})[\W]*$/;
當前,它允許完全合格的單個電子郵件和多個用分號分隔的電子郵件,例如:
email1@hi.com
email1@hi.com; email2@hi.com
email1@hi.com; email2@hi.com; email3@hi.com
...都是有效的。
我希望這保持不變,但也允許空白/空輸入。 我的表單使用空白輸入字段標記$ invalid,即使未在輸入字段上指定required
屬性。
我懷疑這是因為它沒有通過正則表達式驗證。 謝謝!
請不要使用正則表達式匹配電子郵件 。 首先,您的正則表達式是錯誤的(它與foo+bar@example.org
這樣的電子郵件不匹配,對於RFC822和較新的RFC,這是完全有效的)。 您最好使用諸如verifyjs或fogcreek的電子郵件檢查器之類的庫來檢查該電子郵件。
然后,您要做的就是使用email_string.split(';')
在每封電子郵件中拆分字符串,並在每封電子郵件上應用檢查器。
HTH
我最終使用了string.split(;),然后通過了經過改進的RegEx,它應該占今天使用的電子郵件地址的99%。 我正在Angular Directive中執行此操作。
它允許空輸入,多個電子郵件之間用;
分隔;
符合RFC規定的電子郵件地址的大多數用法。
HTML
<input type="text" id="emailCc" name="emailCc" ng-model="vm.ccRecipient" class="form-control input-sm" multiple-emails="vm.ccRecipient" placeholder="Email Cc" />
AngularJS
angular.module('my-app')
.directive('multipleEmails', function () {
return {
require: 'ngModel',
link: function (scope, element, attrs, ctrl) {
ctrl.$parsers.unshift(function (rawInput) {
var emails = rawInput.split(';');
//console.log(emails);
// Consider not using complex regex validation for emails. See: https://davidcel.is/posts/stop-validating-email-addresses-with-regex/
// Instead, consider just checking for an "@" and a "." and call it a done. The mail daemon will return whether its a valid or invalid/bounced email address
//var emailsRegex = /.+@.+\..+/i;
// define single email validator here
var regexPattern = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
// angular.foreach(emails, function() {
var validityArr = emails.map(function (str) {
if (rawInput) {
return regexPattern.test(str.trim());
} else if (!rawInput) {
return true;
}
}); // sample return is [true, true, true, false, false, false]
//console.log(emails, validityArr);
var atLeastOneInvalid = false;
angular.forEach(validityArr, function (value) {
if (value === false)
atLeastOneInvalid = true;
});
if (!atLeastOneInvalid) {
// ^ all I need is to call the angular email checker here, I think.
ctrl.$setValidity('multipleEmails', true);
return rawInput;
} else {
ctrl.$setValidity('multipleEmails', false);
return undefined;
}
});
}
};
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.