2009-02-19 9 views
7

Je souhaite valider une chaîne qui peut être un courriel ou plusieurs courriels séparés par des virgules.Valider plusieurs courriels séparés par des virgules avec javascript

Par exemple:

[email protected] -> TRUE
facture -> FAUX
bill.gates @ microsoft.com, steve.jobs @ apple.com » -> TRUE
bill.gates @ microsoft.com, steve.jobs @ apple.com, bob "-> false bob
, bill.gates @ microsoft.com, steve.jobs @ apple.com" -> false

je suis avec le code suivant qui fonctionne avec les cas de test

function validateEmail(field) { 
    var regex=/\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b/i; 
    return (regex.test(field)) ? true : false; 
} 

function validateMultipleEmailsCommaSeparated(value) { 
    var result = value.split(","); 
    for(var i = 0;i < result.length;i++) 
    if(!validateEmail(result[i])) 
      return false;   
    return true; 
} 

Est-ce le moyen le plus rapide de le faire? Et si je veux autoriser? et, en tant que séparateur?

Répondre

0

Que diriez-vous de diviser la chaîne en un tableau et de la faire défiler en passant une seule adresse e-mail à la fois?

3

Utiliser var result = value.split(","). Vous vous retrouvez avec un tableau.

8

Vous ne devriez pas correspondre à des domaines de premier niveau avec [A-Z]{2,4}:

Qu'en est-.museum ou .travel? Qu'en est-il des domaines IDNA comme .xn--0zwm56d ou .xn--11b5bs3a9aj6g?

En outre, il est parfaitement valide d'avoir une adresse e-mail comme "John Doe"@example.org. À mon avis, tout ce que vous devriez vérifier sur le côté client est si l'adresse contient un @ et s'il y en a au moins un . après. Du côté serveur, vous pouvez vérifier si le serveur existe (vous pouvez même essayer de vous connecter au port SMTP approprié) ou simplement envoyer un mail de validation.

Tout le reste est sujet à des erreurs comme regex réelle pour vérifier les adresses e-mail valides looks like this.


En outre, ce

return (regex.test(field)) ? true : false; 

est un grave WTF - test() retourne déjà une valeur booléenne!


Si vous souhaitez autoriser des séparateurs différents, utiliser une expression régulière au lieu d'une chaîne pour séparer, par exemple

value.split(/,|;/) 
+0

Suggestion d'édition: "... vous devriez vérifier sur le côté client si l'adresse contient ** un et un seul ** @ ..." (cependant, je présume que "@" n'est pas autorisé dans le local -part ??) – Kristen

+2

@Kristen: '@' est autorisé dans les chaînes entre guillemets, mais seulement là; Je n'ai jamais vu des chaînes de guillemets utilisées, bien qu'elles puissent fournir un moyen facile de confondre les bots de spam; il faut également garder à l'esprit que les caractères suivants sont valables même sans citer:! # $% & '* + -/=?^_ '{|} ~ – Christoph

+0

btw, je pense que j'ai lu une fois qu'il y avait même des gens qui utilisent le courrier -adresse avec un domaine ccTLD brut après le '@'; Je ne me souviens pas quel pays, cependant ... – Christoph

1

En général, il est pas possible de valider les adresses e-mail. Quelque chose qui est syntaxiquement valide ne va pas nécessairement n'importe où, et même si c'est le cas s'il sera lu. Et même alors, couvrir toutes les adresses syntaxiquement correctes possibles (selon le RFC applicable) nécessite une regex extrêmement complexe (voir la 1ère édition de "Mastering Regular Expressions" (Friedl, O'Reilly) pour le caractère 4724 ou 6598 versions, et ceux-ci ne gèrent probablement pas les IDN). Par exemple.une apostrophe est un caractère valide dans la partie locale et vous pouvez avoir des commentaires dans l'e-mail.

2

Regex:

((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)* 
0

je validationEngine et underscore.js pour ce faire:

function validateEmail(field, rules, i, options) { 
if (!_.all(field.val().split(","), function(candidate) { return $.trim(candidate).match(options.allrules.email.regex); })) 
    return options.allrules.email.alertText; 
} 

Et puis décoré mon champ de formulaire avec:

<input class="validate[required,funcCall[validateEmail]]" type="text" name="contact_email" id="contact_email" value="" /> 
0

Je jetterait une $.trim(result[i]) dans ce validateMultipleEmailsCommaSeparated fonctionner comme beaucoup de gens vont ajouter l'espace après leur virgule.

Bien sûr, c'est une chose jQuery alors faites l'équivalent à votre façon.

0

utilisé cela pour php preg_match_all()

$pattern = '/([\w+\._%-][email protected][\w+\.-]+\.[\w+]{2,4}[^,;\s])/'; 
$text = '[email protected], efg, [email protected], [email protected] [email protected] [email protected] [email protected]'; 
preg_match_all($pattern, $text, $match); 
var_dump($match); 

array(2) { 
 
    [0] => 
 
    array(5) { 
 
    [0] => 
 
    string(11) "[email protected]" 
 
    [1] => 
 
    string(11) "[email protected]" 
 
    [2] => 
 
    string(13) "[email protected]" 
 
    [3] => 
 
    string(11) "[email protected]" 
 
    [4] => 
 
    string(15) "[email protected]" 
 
    } 
 
    [1] => 
 
    array(5) { 
 
    [0] => 
 
    string(11) "[email protected]" 
 
    [1] => 
 
    string(11) "[email protected]" 
 
    [2] => 
 
    string(13) "[email protected]" 
 
    [3] => 
 
    string(11) "[email protected]" 
 
    [4] => 
 
    string(15) "[email protected]" 
 
    } 
 
}

0

essayer cette

 function validateEmails(string) { 
     var regex = /^([\w-\.][email protected]([\w-]+\.)+[\w-]{2,4})?$/; 
     var result = string.replace(/\s/g, "").split(/,|;/);   
     for(var i = 0;i < result.length;i++) { 
      if(!regex.test(result[i])) { 
       return false; 
      } 
     }  
     return true; 
    } 

accepte à la fois par des virgules et point-virgule comme séparateur, changer que si vous voulez seulement virgule comme séparateur

Questions connexes