web-dev-qa-db-fra.com

Regex pour valider plusieurs adresses de messagerie

J'ai un Regex qui valide mes adresses mail comme ceci:

([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)

Cela fonctionne parfaitement, mais ne permet d'entrer qu'un seul courriel. Maintenant, je voulais étendre cela et permettre l'ajout de plusieurs adresses de messagerie (comme MS Outlook, par exemple) avec un point-virgule comme séparateur de courrier.

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

Maintenant, j'ai cherché et trouvé celui-ci:

([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}(;|$))

Cela fonctionne sur un point, mais malheureusement nécessite un point-virgule à la fin d'un mail:

[email protected];

Ce n'est pas ce que je veux quand l'utilisateur entre un seul e-mail.

Comment puis-je étendre mon regex au dessus (le premier) pour permettre l'ajout de plusieurs adresses mail tout en les séparant par un point-virgule?

21
SeToY

Ceci est votre expression originale, modifiée pour permettre plusieurs courriels séparés par des points-virgules et (éventuellement) des espaces en plus des points-virgules Il permet également une adresse électronique unique qui ne se termine pas par un point-virgule.

Cela permet des entrées vierges (pas d'adresses électroniques). Vous pouvez modifier le * final par + pour exiger au moins une adresse.

(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))*

Si vous devez autoriser les virgules, à part le point-virgule, vous pouvez modifier ce groupe:

(\s*;\s*|\s*$)

par celui-ci:

(\s*(;|,)\s*|\s*$)

Remarque importante: comme l'indique le commentaire de Martin, s'il y a du texte supplémentaire avant ou après la liste d'adresses électroniques correcte, la validation n'échouera pas. Donc, cela fonctionnerait comme un "chercheur de courrier électronique". Pour que cela fonctionne comme un validateur, vous devez ajouter ^ au début de la regex, et $ à la fin. Cela garantira que l'expression correspond à tout le texte. Donc, le reex complet serait:

^(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))*$

Vous pouvez ajouter un \s* supplémentaire après le ^ pour tolérer les espaces au début de la liste, comme ceci. C'est à dire. include ^\s* au lieu de simplement ^ L'expression tolère déjà les blancs à la fin tels quels.

46
JotaBe

Old Post - avait besoin du même RegEx. La réponse acceptée n'a pas fonctionné pour moi, cependant, cela a fonctionné.

^(|([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([;.](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$

Récupéré de ce message , cependant, la réponse acceptée ne fonctionnait pas non plus, mais l'expression rationnelle sur le lien DANS le message demeurait.

[email protected] - valide

[email protected];[email protected] - valide

[email protected]; - ne valide pas

empty string - valide

Si vous souhaitez valider par rapport à une chaîne vide, supprimez le | au début de l'expression régulière

3
Rob Scott

Pourquoi ne pas simplement diviser le point-virgule, puis valider chaque adresse électronique potentielle en utilisant votre expression rationnelle existante? Ecrire une énorme expression rationnelle va être très difficile et un cauchemar de maintenance, je suppose.

2
Brian Agnew

S'il vous plaît essayer ceci

^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,4};?)+$
2
PraveenVenu

Les noms de domaine sont en réalité beaucoup plus complexes. Par exemple, la plupart des TLD utilisent maintenant les noms de domaine Unicode , qui sont assez répandus en Europe. Considérons l’adresse mail mailtest@пример.испытание, qui est en réalité parfaitement valide (bien qu'ils puissent toujours être transcrits sous l'ancien formulaire - [email protected]). Cela signifie qu'il est probablement plus facile de définir les caractères valables pour un nom de domaine not. Voir ICANN .

De plus, les TLD ne font pas non plus strictement partie de l'ensemble que vous avez défini, voir Liste des IANAs des TLD valides . Par exemple, [email protected] est une adresse électronique valide.

En bref, pour valider les adresses électroniques, envisagez d’utiliser une bibliothèque tierce établie, à moins que vous ne traitiez avec un cas spécial limité.

Pour répondre à votre question initiale, je vous recommanderais une étape de prétraitement dans laquelle vous divisez des délimiteurs raisonnables (',' et ';'), coupez les espaces (au moins si vous utilisez une entrée utilisateur) et validez chaque entrée.

1
Krumelur

Dans un vieux livre de regex, ils indiquaient qu'il était impossible d'écrire une regex pour faire correspondre les adresses e-mail valides all (bien que vous puissiez vous en approcher).

Voici un site Web traitant des expressions régulières et des adresses électroniques.

Je vous recommanderais de scinder la chaîne aux limites ; et , et de vérifier chaque adresse électronique séparément pour déterminer si elle est valide/non valide avec votre regex.

0
Uwe Keim

Voici ma solution et cela a fonctionné comme prévu pour moi:

      var emailReg = new RegExp(/^([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[A-Z]{2,6})*([,;][\s]*([A-Z0-9.%+-]+@@[A-Z0-9.-]+.[A-Z]{2,6}))*$/i);
  var emailText = $('#email').val();

  if (!emailReg.test(emailText)) {
      alert('Wrong Email Address\Addresses format! Please reEnter correct format');
        return false;
    }
}
0
Qasim Bataineh

Voici un programme simple qui le fait pour vous sans utiliser l'expression régulière. Bien, en fait, il utilise une expression régulière, mais nous n'avons pas à nous en soucier.

public function test_reg()

{

   $email_list = '';

        $array = explode(";",$email_list);

        foreach ($array as $value)
         {
            $value;

            if (!filter_var($value, FILTER_VALIDATE_EMAIL) === false)
             {
                 $msg =  "Email List Contains  valid email addresses.";
              } 
            else
             {
                 $msg ="Your Email list contains an invalid email at. &nbsp&nbsp &nbsp".$value;
                 break;
             }  
         }

                echo $msg;



}

Vous devez séparer vos emails par un point-virgule.

0
user6817600

Quelque chose que j'ai écrit dans mes jours. La validation de base des e-mails est issue de la mise en œuvre pratique de RFC 2822

^([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])(;)?)+$

correspond aux courriels avec; séparateur 

Je vous voulez plus de séparateurs swap (;)? avec [;, |]? etc avec les crochets [].

0
Shuffler

C'est une très vieille question, mais je pensais partager mon code C #.

J'ai décidé d'analyser au point-virgule puis de vérifier chaque email individuellement:

        string toAddress = "[email protected];[email protected];";
        Regex rgx = new Regex(@"^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)?@[a-z0-9-]+(\.[a-z0-9-]+)*$");
        List<string> emailArray = new List<string>();

        if(toAddress != null && toAddress != "")
        {
            if (toAddress.IndexOf(";") != -1)
            {
                emailArray = toAddress.Replace(" ","").Split(';').ToList();
            }
            else
            {
                emailArray.Add(toAddress);
            }


            foreach (string email in emailArray)
            {

                if (rgx.IsMatch(email ?? ""))
                {
                    SendEmail(email, subject, body);


                }
            }
        }
0
Jacob Morris