【问题标题】:Regex: Allow multiple emails separated by ; (semicolon) AND allow blank/empty value正则表达式:允许以 ; 分隔的多个电子邮件(分号)并允许空白/空值
【发布时间】:2016-06-24 07:29:27
【问题描述】:

这是我的正则表达式:

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 属性。

我怀疑这是因为它没有通过正则表达式验证。谢谢!

【问题讨论】:

  • 试试这个 /([^your regex ,]\/*/g
  • 作为答案,使用正则表达式验证电子邮件充满危险。您最多应该检查以确保存在@。之后,验证地址的唯一真正方法是发送电子邮件
  • 我喜欢检查 @. 的想法 - 并且还允许为空 - 那是什么正则表达式? /.+@.+\..+/i 有效,但仍然不允许为空。

标签: javascript angularjs regex validation


【解决方案1】:

Please do not use a regex to match an email。首先,您的正则表达式是错误的(它不会匹配像 foo+bar@example.org 这样的电子邮件,这在 RFC822 和更新的 RFC 中是完全有效的)。您最好使用 verifyjsfogcreek's email checker 之类的库来检查该电子邮件。

然后您所要做的就是使用email_string.split(';') 将您的字符串拆分为每封电子邮件,并在每个电子邮件上应用检查器。

HTH

【讨论】:

  • 谢谢你,我正在阅读你的文章建议,很快就会回来接受。
  • 这篇文章很有道理。但是,我真的不想仅仅为了检查电子邮件而包含另一个库。我更喜欢他们的建议,即仅检查 @. 并将其称为有效。那么如何使这个正则表达式允许使用 @. 为空或任何内容?他推荐的/.+@.+\..+/i 做了这个检查,但不允许为空。
  • 哦,你可以试试/(.+@.+\..+)?/i () 将完整模式分组,()? 将使其匹配 01 正则表达式本身。
【解决方案2】:

我最终使用了 string.split(;),然后通过了改进的 RegEx,它应该占当今使用的电子邮件地址的 99%。而且我是在 Angular 指令中做的。

它允许空输入,由; 分隔的多封电子邮件,这符合 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;
              }

          });
      }
  };
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2015-03-19
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多