2009-08-11 10 views
0

En PHP, j'utilise ce regex pour le contrôle de mails:PHP email regex en permettant droite 2Points après eachother

$rexMail = "/^[a-z0-9\._][email protected]{1}[a-z0-9-_]+\.{1}[a-z]{2,4}\.?[a-z]{0,2}$/i"; 

Dans la plupart des cas, cela suffira. Cependant, cette adresse mail se révèle être valide pour la regex:

test..test @ test.com

Cela ne devrait pas être possible. Bien que plusieurs points soient autorisés avant le signe @, il ne devrait pas être possible d'en avoir plusieurs les uns après les autres.

Je ne suis pas que bon avec regex et je ne sais pas comment résoudre ce problème.

En outre, je ne suis pas sûr de la quantité de points après le signe @, car il existe des adresses de messagerie telles que .co.uk, ou pire.

Répondre

1

ici:

/^([a-z0-9_]\.?)*[a-z0-9_][email protected]([a-z0-9-_]+\.)+[a-z]{2,3}$/i 

La partie de l'adresse e-mail après le @ est potentiellement tout domaine valide, vous devez autoriser un certain nombre de séparés. Éléments au-dessus du TLD - par exemple, email.staff .mycompany.com est un hôte valide. En outre, un domaine de premier niveau peut contenir plus de 2 caractères; beaucoup des communes sont 3 (.com, .net, etc).

Cependant, commentaire de VoteyDisciple ci-dessous est valide - techniquement, une adresse e-mail peut avoir .. en elle.

+0

Maintenant encore moins des choses correspond – KdgDev

+0

Essayez de copier à nouveau l'expression rationnelle, je l'avais édité pour modifier un léger problème. – Amber

+0

Là nous l'avons, travaillant – KdgDev

3

D'abord, test..test @ example.com est une adresse e-mail parfaitement valide. Rien ne dit qu'une adresse e-mail ne peut pas avoir plusieurs caractères de période consécutifs avant le signe @. En fait, vous pouvez avoir à peu près n'importe quoi avant le signe @, y compris certains caractères que vous n'autorisez pas (par exemple, +). Donc, vous allez rejeter une variété d'adresses parfaitement valides comme vous l'avez écrit maintenant.

Voir http://www.regular-expressions.info/email.html pour une expression simple qui va faire l'affaire, avec quelques explications sur la raison pour laquelle la validation de l'adresse e-mail s'égare généralement lorsque fait avec des expressions régulières.

1

Le problème est de savoir comment les classes de caractères fonctionnent: Une classe de caractères, comme [a-z0-9 ._] +, signifie "l'un de ceux-ci - avec cette règle appliquée une ou plusieurs fois". Fondamentalement, il n'y a rien dans les règles de la classe de caractères telles que vous ne pouvez pas répéter les caractères. L'astuce est que vous voulez séparer les "mots" avec des points, et vous devez tenir compte de ce regroupement.

Tenir compte quelque chose comme ceci:

$rexMail = "/^[a-z0-9_]+(\.[a-z0-9_]+)*@{1}[a-z0-9-_]+\.{1}[a-z]{2,4}\.?[a-z]{0,2}$/i"; 

Cela dit essentiellement, « un mot (composé de caractères alphanumériques ou underscore), puis éventuellement (zéro fois ou plus) un point, suivi d'un autre mot. » Par ailleurs, le quantificateur {1} n'est jamais nécessaire car, par défaut, si vous ne spécifiez pas de quantificateur, le moteur regex le recherche une seule fois. .

+0

Je ne le savais pas sur le quantificateur, bien que la regex ne fonctionnera pas pour les adresses plus longues après le signe @, comme mail.company.subcompany.com – KdgDev

+0

Très vrai, ce ne sera pas le cas. Je répondais juste sa question sur les deux périodes, puisque les gens m'avaient déjà battu à la validité de l'expression régulière elle-même. Désolé pour la confusion. OP, assurez-vous de prendre cela en compte si vous utilisez l'expression rationnelle que j'ai fournie. –

+0

Oh, et je voulais aussi mettre en évidence le fait de devoir regrouper les "mots" de l'adresse e-mail, bien que nous sachions que ce n'est pas nécessaire puisque .. est autorisé avant le @. Mais comprendre quand il pourrait être nécessaire de penser en termes de groupements potentiels (et plus tard, de captures) est une compétence fondamentale pour travailler avec regex, et je veux aider l'OP à découvrir des modèles qui permettent/nécessitent des groupements. Dans ce sens, une autre chose importante est de déterminer vos conditions aux limites. J'ai placé la période au début du groupe parce que je devais, et je laisse à l'OP de raisonner pourquoi. –

0

Vous trouverez peut-être http://www.regular-expressions.info/email.html utile.Il est presque impossible de mettre en œuvre une vérification valide des adresses e-mail en utilisant uniquement des expressions régulières. Cependant, cette page aborde plusieurs alternatives.

J'ai tendance à utiliser celui situé au bas de la page. Je l'ai trouvé plus approprié pour l'utilisation des applications Web, et modifié légèrement pour travailler avec Évasion PHP:

//courtesy of http://www.regular-expressions.info/email.html, modified to be escaped for PHP string and preg_match 
$exp = '[a-z0-9!#$%&\'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?'; 
if (! preg_match('/^'.$exp.'$/i', $email)) return false; 
0

Vous voulez vous assurer que l'expression régulière est aussi clémente que possible. Comme il y a beaucoup d'adresses valides, cela ne correspondra pas.

Voici une bibliothèque PHP pour le travail de validation email syntaxe: http://code.google.com/p/php-email-address-validation/

Il est assez difficile de valider effectivement des e-mails sans envoyer un courriel à eux. Mais la validation SMTP fonctionne dans la plupart des cas, mais les échecs doivent également être traités comme un échec possible, pas un échec réel.

Voici une classe qui validera des e-mails via SMTP: http://code.google.com/p/php-smtp-email-validation/