Problème d'expression rationnelle pour vérifier un email

psychoreflex

WRInaute impliqué
Bonjour,

J'ai un petit problème avec l'expression rationnelle ci-dessous, qui vérifie si le mail entré dans le formulaire est conforme au masque.



Code:
if(preg_match( "/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]{2,}[.][a-z]{2,4}$/", $email ))
{$emailVerif=1;}

Le problème, c'est qu'un email de la forme @bob.com va passer quand même, alors qu'il n'y a rien devant le @.

Auriez-vous la solution ?
 

Suede

WRInaute passionné
Pourquoi ?
Le + , c'est 1 ou plus normalement?
Au pire,tu fais comme pour la deuxieme partie {1,}
 

ortolojf

WRInaute accro
psychoreflex a dit:
Code:
if(preg_match( "/^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\.-]{2,}[\.][a-z]{2,4}$/", $email ))
{$emailVerif=1;}

Auriez-vous la solution ?


Bonjour
Dans une première approche, j'ai rajouté le backslash ( \ ) avant chaque point ( . ) , car sinon, le point situé entre deux [ ] désigne n'importe quel caractère, même quand ce n'est pas un point....

Et puis, telle quelle, cette expression rationnelle matchera aussi des adresses emails, où plusieurs points se suivent, soit à gauche, soit à droite de l'arobase ( @ ), sans caractère autre intermédiaire.

A améliorer donc...

Bien à toi.
Amicalement.

Jean-François Ortolo
 

psychoreflex

WRInaute impliqué
Salut Jean François,

Je ne sais pas si j'ai bien lu ce que tu dis, mais j'ai essayé d'entrer les emails suivants pour tester :

bob@bob-com
bob*bob@bob.com
bob@bob:com

Tous ont été bloqué avec l'expression rationnelle que j'ai écrit en haut.

C'est de ces caractères, dont tu parlais ?
 

ortolojf

WRInaute accro
psychoreflex a dit:
Salut Jean François,

Je ne sais pas si j'ai bien lu ce que tu dis, mais j'ai essayé d'entrer les emails suivants pour tester :

bob@bob-com
bob*bob@bob.com
bob@bob:com

Tous ont été bloqué avec l'expression rationnelle que j'ai écrit en haut.

C'est de ces caractères, dont tu parlais ?


Bonjour psychoreflex

Théoriquement, le point [.] peut remplacer un caractère, c'est-à-dire je crois ( pas sûr ), une lettre majuscule ou minuscule, ou un chiffre.

Donc, c'est logique que l'astérisque ou le tiret à droite de l'arobase, ne passent pas.

Mais, si tu testais avec ton expression rationnelle l'expression suivante, cela ne devrait pas passer:

bob.bob@bob.com

En effet, il me semble que le point [.] ne se désigne pas lui-même. Je peux me tromper.

Si je dis que l'expression rationnelle peut être améliorée, c'est que j'ai vu récemment sur le forum fr.comp.lang.php un thread sur le même sujet, où ce problème était résolu de façon très complexe, à cause de la RFC je ne sais plus combien, qui spécifie le format des adresses emails. Cette RFC est, je crois, assez compliquée.

Bien à toi.
Amicalement.

Jean-François Ortolo
 

bordas_69

WRInaute discret
Dans le temps, j'avais fait une expression rationnelle pour vérifier les email :

Code:
/*******************************************************************************
 * Fonction permettant de tester qu'une chaine de caractère est conforme aux
 * règles de la création d'un email.
 *        - La premiere lettre doit etre [a-zA-Z]
 *        - Ensuite, on peut avoir les caractères [a-zA-Z0-9.-_]
 *        - Le @ est obligatoire
 *        - Directement apres, on impose [a-zA-Z]
 *        - Ensuite, on peut avoir les caractères [a-zA-Z0-9.-_]
 *        - On termine obligatoirement par .[a-zA-Z]{2,4}
 *        - Avant le dernier point, il ne peut y avoir que [a-zA-Z0-9]
 
 *        - Test DNS du serveur WEB (mail)
 *        - détermination de l'OS nécessaire car La fonction checkdnsrr n'est
 *          pas implémentée sous Windows.
 * @IN : $email
 * @OUT : boolean
 *        TRUE si $email est une adresse email conforme
 *        FALSE autrement
 * @Auteur : bordas_69
 * @Date : 27/04/2005 21:48:59
 ******************************************************************************/
function test_email ($email)
{
   $recherche = '/^[a-zA-Z]+([a-zA-Z0-9]*[\.\-\_]*)*\@[a-zA-Z]+([a-zA-Z0-9]*[\.\-\_]*)*[a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/';
   //return preg_match($recherche,$email);
   
   if(preg_match($recherche,$email))
   {
       if (ServeurWeb("localhost")){ //OS WIndows (win32)
            if(myCheckDNSRR(array_pop(explode("@",$email)),"MX")) return true;
            else return false;
       }
       else{ //Serveur Linux
            if (checkdnsrr(array_pop(explode("@",$email)),"MX")) return true;
            else return false;
       }
   }
   else return false;
}

Bon, je vérifiais en plus que le domaine existait et qu'il possédait un serveur MX... Mais tu peux uniquement utiliser l'expression :


Code:
recherche = '/^[a-zA-Z]+([a-zA-Z0-9]*[\.\-\_]*)*\@[a-zA-Z]+([a-zA-Z0-9]*[\.\-\_]*)*[a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/';

En espérant que ca a pu t'aider...
 

ortolojf

WRInaute accro
bordas_69 a dit:
Code:
recherche = '/^[a-zA-Z]+([a-zA-Z0-9]*[\.\-\_]*)*\@[a-zA-Z]+([a-zA-Z0-9]*[\.\-\_]*)*[a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/';

En espérant que ca a pu t'aider...


N'y a-t-il pas une légère erreur ?

Cette expression accepte les caractères point ( . ), ou tiret ( - ), ou souligné ( _ ) qui ne soient pas séparés par un ou plusieurs caractères alphanumériques.

A mon avis, la sub-expression:

([a-zA-Z0-9]*[\.\-\_]*)*

à droite et à gauche de l'arobase, aurait intérêt à être remplacée par celle-ci:

([\.\-\_][a-zA-Z0-9]+)*

Dans le cas où il n'y a pas de point, tiret, ni souligné, ça passe.
Dans le cas où l'expression entre parenthèses est instanciée ( donc il y a au moins un point, tiret, ou souligné ), cela nécessite au moins un caractère entre chacun de ces points, tirets, ou soulignés.

Bien à vous.
Amicalement.

Jean-François Ortolo
 

ortolojf

WRInaute accro
bordas_69 a dit:
Donc pour toi l'email : tarata___bidule@truc-machin--chose.com ne doit pas être prise en compte?

Or il n'y a pas de restriction sur cet email... Elle est tt a fait valide...


Oui, allors mettons...

([\.\-][a-aA-Z0-9]+([\_][a-zA-Z0-9]+)*)*

à la place de:

([a-zA-Z0-9]*[\.\-\_]*)*

Si tu penses que les tirets peuvent être répétés aussi:

([\.][a-zA-Z0-9]+([\-\_][a-zA-Z0-9]+)*)*

Normalement ça devrait marcher, s'il n'y a pas d'accent.
S'il y a des accents, il suffit de rajouter les lettres accentuées dans les sub-expressions [a-zA-Z0-9]+

Si un tiret peut suivre ou être précédé par un souligné, il suffit de faire autant de sub-expressions ([\-][a-zA-Z0-9]+)* ( ou ([\_][a-zA-Z0-9]+)* ) qu'il y a de caractères supplémentaires ( dans ce cas tiret et souligné ).

Faut voir la RFC.

Bien à vous.
Amicalement.

Jean-François Ortolo
 

Discussions similaires

Haut