Regex pour la validation de plusieurs adresses E-Mail
j'ai reçu un Regex qui valide mes adresses postales 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 bien, mais permet seulement un e-mail à entrer. Maintenant, j'ai voulu étendre cela et permettre plusieurs adresses de courrier à ajouter (tout comme MS Outlook, par exemple) avec un point-virgule comme un mail-splitter.
mail1@tld.com;mail2@tld.com;mail3@tld.com
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 courrier:
mail1@tld.com;
ce n'est pas ce que je veux quand l'utilisateur entre seulement un e-mail.
Comment puis-je étendre mon regex ci-dessus (le premier) pour permettre l'ajout de plusieurs adresses postales tout en les séparant par un point-virgule?
10 réponses
il s'agit de votre expression originale, modifiée de sorte qu'elle autorise plusieurs e-mails séparés par un point-virgule et (éventuellement) des espaces en plus du point-virgule. Il permet également une adresse mail qui n'est pas au point-virgule.
permet des entrées en blanc (pas d'adresse e-mail). Vous pouvez modifier la finale * en + d'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 la virgule, en dehors du point-virgule, Vous pouvez cocher 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 e-mail correcte, la validation n'échouera pas. Cela fonctionnerait donc comme un"chercheur d'e-mails". Pour qu'il fonctionne en tant que validateur, vous devez ajouter ^
au début du regex, et $
à la fin. Cela permettra de s'assurer que l'expression correspond à tout le texte. L'réexe 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*
après le ^
pour tolérer les blancs au début de la liste, comme ceci. I. e. inclure ^\s*
au lieu de simplement ^
L'expression déjà tolère les blancs à la fin.
Old post - besoin de la 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})+)*$
Extrait de ce post , cependant, l'on a accepté la réponse n'a pas de travail, soit, mais les Regex sur le lien DANS le post n'.
abc@abc.com
- valide
abc@abc.com;123@qwer.com
- valide
abc@abc.com;
- ne valide pas
empty string
- valide
si vous voulez valider par rapport à une chaîne vide, supprimez le |
au début du regex
pourquoi ne pas simplement diviser sur le point-virgule et ensuite valider chaque adresse e-mail potentielle en utilisant votre regexp existant ? Écrire un grand regexp va être très difficile et un cauchemar de maintenance, je suppose.
s'il vous Plaît essayer cette
^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,4};?)+$
les noms de domaines sont en fait beaucoup plus complexes. Par exemple , la plupart des TLD utilisent désormais les noms de domaine Unicode , qui sont assez courants en Europe. Considérez l'adresse email mailtest@пример.испытание, qui est en fait parfaitement valide (bien qu'ils puissent toujours être transcrits à l'ancienne forme - mailtest@xn--hxajbheg2az3al.xn--jxalpdlp). Cela signifie qu'il est probablement plus facile de définir ce que les caractères sont pas valide pour un nom de domaine. Voir ICANNs .
en outre, les TLD ne font pas non plus strictement partie de l'ensemble que vous avez défini, voir ianas liste des TLD valides . Par exemple, example@example.travel est une adresse e-mail valide.
en bref, pour valider les adresses e-mail, envisagez de vous adresser à une bibliothèque tierce établie, à moins que vous ne traitiez d'un cas spécial limité.
maintenant pour votre question originale, je recommande une étape de pré-processus où vous vous divisez sur des délimiteurs raisonnables ( ' , ' et ';'), trim whitespace (au moins s'il s'agit d'une entrée utilisateur) et valider chaque entrée.
dans un vieux livre regex ils ont déclaré que vous ne pouvez pas écrire un regex pour correspondre tous adresses e-mail valides (bien que vous pouvez venir près).
voici un site web traitant des adresses regex et e-mail.
je vous recommande de diviser la chaîne de caractères aux limites ;
et ,
et de vérifier chaque adresse e-mail séparément pour être valide/invalide avec votre regex.
ci-dessous est ma solution et il 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;
}
}
quelque chose que j'ai écrit de mon temps. La validation e-mail de base est tirée 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 e-mails avec; séparateur
je vous en voulez plus séparateurs de swap (;)? avec [;,|]? etc à l'intérieur des crochets [].
voici un programme simple qui le fait pour vous sans utiliser l'Expression régulière.Eh bien en Fait, il utilise une expression régulière, mais nous n'avons pas à vous soucier de la façon dont il regarde .php le fait pour nous .
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.     ".$value;
break;
}
}
echo $msg;
}
Vous devez séparer vos e-mails par un point virgule.
c'est une très vieille question, mais j'ai pensé que je partagerais mon C# code.
j'ai décidé de discuter par le point-virgule puis vérifier chaque e-mail individuellement:
string toAddress = "testemail@gmail.com;test2@testing.com;";
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);
}
}
}