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

psychoreflex
WRInaute passionné
WRInaute passionné
 
Messages: 1123
Inscription: 10 Juil 2005

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

Message le Sam Avr 22, 2006 20:59

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: Tout sélectionner
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 accro
WRInaute accro
 
Messages: 3722
Inscription: 4 Oct 2002

Message le Sam Avr 22, 2006 21:06

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

psychoreflex
WRInaute passionné
WRInaute passionné
 
Messages: 1123
Inscription: 10 Juil 2005

Message le Sam Avr 22, 2006 21:15

Non c'est bon, c'est mon script qui foirait, plus bas.

Merci à toi Suede.


ortolojf
WRInaute passionné
WRInaute passionné
 
Messages: 1676
Inscription: 14 Aoû 2002

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

Message le Dim Avr 23, 2006 16:01

psychoreflex a écrit:
Code: Tout sélectionner
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 passionné
WRInaute passionné
 
Messages: 1123
Inscription: 10 Juil 2005

Message le Dim Avr 23, 2006 18:20

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 passionné
WRInaute passionné
 
Messages: 1676
Inscription: 14 Aoû 2002

Message le Dim Avr 23, 2006 19:10

psychoreflex a écrit: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

psychoreflex
WRInaute passionné
WRInaute passionné
 
Messages: 1123
Inscription: 10 Juil 2005

Message le Dim Avr 23, 2006 19:41

Bon alors j'ai retesté avec bob.bob@bob.com et le mail est validé.

Tu fais bien au passage de me rappeler d'aller jeter un oeil de temps à autre sur les RFC.


bordas_69
WRInaute discret
WRInaute discret
 
Messages: 239
Inscription: 25 Aoû 2005

Message le Lun Avr 24, 2006 0:36

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

Code: Tout sélectionner
/*******************************************************************************
* 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: Tout sélectionner
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 passionné
WRInaute passionné
 
Messages: 1676
Inscription: 14 Aoû 2002

Message le Lun Avr 24, 2006 7:27

bordas_69 a écrit:
Code: Tout sélectionner
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


bordas_69
WRInaute discret
WRInaute discret
 
Messages: 239
Inscription: 25 Aoû 2005

Message le Lun Avr 24, 2006 10:05

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...


ortolojf
WRInaute passionné
WRInaute passionné
 
Messages: 1676
Inscription: 14 Aoû 2002

Message le Lun Avr 24, 2006 13:31

bordas_69 a écrit: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


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : Hello

  • Analyser la classe C de l'adresse IP
    Cet outil vous permet de vérifier si plusieurs sites sont hébergés sur la même classe C (adresse IP du serveur).
  • Analyser le positionnement dans Google
    Cet outil vous permet de vérifier si une ou plusieurs page(s) de votre site arrive(nt) dans les premiers résultats de Google, pour certains mots-clés recherchés.
  • Analyser le positionnement dans Yahoo
    Cet outil vous permet de vérifier si une ou plusieurs page(s) de votre site arrive(nt) dans les premiers résultats de Yahoo, pour certains mots-clés recherchés.


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité