2016-03-09 70 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; 
       } 

      }); 
     } 
    }; 
}); 
相關問題