簡體   English   中英

正則表達式:允許多封電子郵件,以;分隔 (分號)並允許空白/空值

[英]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,這是完全有效的)。 您最好使用諸如verifyjsfogcreek的電子郵件檢查器之類的庫來檢查該電子郵件。

然后,您要做的就是使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM