2016-03-09 33 views
2

这里是我的正则表达式:正则表达式:允许分隔多个电子邮件; (分号),并允许空/空值

var emailsRegex = /^[\W]*([\w+\-.%][email protected][\w\-.]+\.[A-Za-z]{2,4}[\W]*;{1}[\W]*)*([\w+\-.%][email protected][\w\-.]+\.[A-Za-z]{2,4})[\W]*$/; 

目前,它允许完全合格单封电子邮件,并用分号分隔的多个电子邮件,例如:

[email protected] 
[email protected]; [email protected] 
[email protected]; [email protected]; [email protected] 

...是全部有效。

我希望这个保持不变,但也允许空白/空输入。即使在输入字段上没有指定required属性,我的表单也会在空白输入字段中标记$ invalid。

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

+0

试试这个/([^您正则表达式,] \/*/g的 –

+0

作为一个答案的状态,用一个正则表达式验证电子邮件是充满了危险。你最多应该检查以确保存在一个'@'。之后,验证地址的唯一方法是发送电子邮件 – Brennan

+0

我喜欢这个想法来检查'@'和'.' - 并且也允许为空 - 这个正则表达式是什么?'/[email protected]+\..+/我工作,但它仍然不允许em PTY。 – TetraDev

回答

3

Please do not use a regex to match an email。首先你的正则表达式是错误的(它不会匹配[email protected]这样的电子邮件,这对于RFC822和更新的RFC来说是完全有效的)。你应该更好地使用像verifyjsfogcreek's email checker这样的库来检查该电子邮件。

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

HTH

+0

谢谢,我正在阅读您的文章建议,并且很快会回来接受。 – TetraDev

+0

这篇文章很有意义。不过,我不想包含另一个库来检查电子邮件。我更喜欢他们的建议,只是检查'@'和'.'并将其称为有效。那么,如何让这个正则表达式允许用'@'和'.'来允许空或者任何东西?他对'/[email protected]+\..+/i'的建议做了这个检查,但不允许为空。 – TetraDev

+0

哦,你可以试试'/([email protected]+\..+)?/我''()'将分组完整的模式,'()?'会使它匹配'0'或' 1'乘以正则表达式本身。 – zmo

-1

我结束了使用string.split(;),然后经过改进的正则表达式应该在今天使用的占电子邮件地址的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 = /[email protected]+\..+/i; 

       // define single email validator here 
       var regexPattern = /^(([^<>()\[\]\\.,;:\[email protected]"]+(\.[^<>()\[\]\\.,;:\[email protected]"]+)*)|(".+"))@((\[[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; 
       } 

      }); 
     } 
    }; 
}); 
相关问题