IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Tester un mail


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Points : 224
    Points
    224
    Par défaut Tester un mail
    Bonjour,

    Je m'initie aux expressions régulières avec Le PDF de Naholyr et je bute déjà sur le premier exemple.

    Voici le code retravaillé (une partie en POSIX et l'autre en PCRE)
    Le principe est de, d'abord, vérifier que la chaine $adresse est bien un email valide, puis d'extraire cette adresse de la chaine $texte.

    Les 2 méthodes utilisent le même pattern à la syntaxe près.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    $adresse = 'm.test@monfai.fr';
    $texte = 'Cette chaine : '. $adresse . ' contient un mail';
     
    echo '<strong>VERSION POSIX</strong>' . '<br /><br />'; 
    if (ereg('^[[:alnum:]_\.]+@[[:alnum:]_\.]+\.[[:alpha:]]+$', $adresse)) 
        echo $adresse . ' est invalide.<br /><br />'; 
    else
        echo $adresse . ' est valide.<br /><br />';
    if (ereg('([[:alnum:]_\.]+)@([[:alnum:]_\.]+\.[[:alpha:]]+)', $texte, $regs)) 
    {
        echo 'On a trouvé l\'adresse ' . $regs[0] . ' dans "' . $texte . '"<br />'; 
        echo 'LOGIN : ' . $regs[1] . ' - '; 
        echo 'DOMAINE : ' . $regs[2] . '<br /><br />'; 
    }
    else
        echo 'aucune adresse e-mail dans cette chaîne.<br /><br />';
    print_r($regs);
    echo '<br /><br />';
     
     
     
    echo '<strong>VERSION PCRE</strong>' . '<br /><br />'; 
    if (preg_match('`^[\w\.]+@[\w\.]+\.[a-z]+$`i', $adresse))
        echo $adresse . ' est invalide.<br /><br />';
    else
        echo $adresse . ' est valide.<br /><br />';
     
    if (preg_match('`([\w\.]+)@([\w\.]+\.[a-z]+)`i', $texte, $regs)) 
    {
        echo 'On a trouvé l\'adresse ' . $regs[0] . ' dans "' . $texte . '"<br />'; 
        echo 'LOGIN : ' . $regs[1] . ' - '; 
        echo 'DOMAINE : ' . $regs[2] . '<br /><br />'; 
    } 
    else
        echo 'aucune adresse e-mail dans cette chaîne.<br /><br />';
    print_r($regs);
    echo '<br /><br />';
    Mon problème est le suivant :
    - Tel quel, les 2 méthode m'inquent que le mail est invalide mais l'extraient correctement de la chaine $texte
    - Si j'ajoute un tiret (-) entre "mon" et "fai", c'est le contraire : le mail serait valide mais impossible de l'extraire.

    il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
    Des fois ça malche, des fois ça malche pas. Garcimore

  2. #2
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    je sais pas si ca peut t'aider, mais y a la FAQ qui traite ca : http://php.developpez.com/faq/?page=mail#mail_verif

    et un conseil, ne travaille qu'en PCRE, donc preg_ parce que c'est beaucoup plus rapide !!

  3. #3
    Membre actif Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Points : 224
    Points
    224
    Par défaut
    J'ai bien l'intention de na travailler qu'avec PCRE mais je voudrais également comprendre POSIX pour le cas où je tomberait sur une RegExp POSIX.
    De plus, j'ai du lire quelque part que, pour des requetes simples, il peut être plus simple d'utiliser [:alpha:] plutot que \w qui est plus complète et donc moins précise.

    Je lis ton lien...

    C'est bête mais j'ai pensé à la FAQ quand j'ai cherché une doc sur les RegExp mais je n'y ai pas pensé pour mon pb
    il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
    Des fois ça malche, des fois ça malche pas. Garcimore

  4. #4
    Membre actif Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Points : 224
    Points
    224
    Par défaut
    Bon, déjà il faudrait que je mette les if dans le bon ordre:
    C'est à dire que si preg_match retourne vrai c'est que c'est "valide" et non "invalide" comme je l'ai écrit

    Ensuite, comment j'ajoute la possibilité du signe "-" dans mes crochets ?
    ([\w\.]+)@([\w\.]+\.[a-z]+)

    comme ça
    ([\w\.]+)@([\w\.-]+\.[a-z]+)

    ou comme ça
    ([\w\.]+)@([\w\.\-]+\.[a-z]+)

    ?

    Et, après avoir lu le modèle de la FAQ, je vais chercher (tout seul comme un grand ) à voir pour rejeter les adresses commencant par autre chose qu'une lettre comm ".toto@fai.fr"

    il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
    Des fois ça malche, des fois ça malche pas. Garcimore

  5. #5
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Juste au cas où le lien serait passé inaperçu malgré sa présence dans la FAQ :
    Initiation aux expressions régulières en PHP

    Étant donné que la norme POSIX est moins complète que les PCRE, tu peux apprendre uniquement ces dernières.

    Maxoo : ce n'est pas toujours plus rapide, malheureusement.
    Fais un test sur des regexes simples, tu verras

  6. #6
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    Citation Envoyé par Yogui
    Maxoo : ce n'est pas toujours plus rapide, malheureusement.
    Fais un test sur des regexes simples, tu verras
    http://www.expreg.com/pcreplus.php

    ce n'est qu'un exemple mais j'ai toujours vu les sites dire que c'était plus rapide, et je l'ai testé moi même, y a même des sites qui chronomètre le temps d'éxecution je crois.

    Enfin bref, moi j'ai toujours vu que c'était plus rapide...

  7. #7
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    C'est aussi ce que j'ai toujours lu mais, en écrivant le tuto, j'ai fait qqes tests et ça n'a pas confirmé...
    Certaines regex simples inversent la tendance. Si j'ai le temps un jour, je te donnerai un exemple.
    [/HS]

  8. #8
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    Citation Envoyé par Yogui
    C'est aussi ce que j'ai toujours lu mais, en écrivant le tuto, j'ai fait qqes tests et ça n'a pas confirmé...
    Certaines regex simples inversent la tendance. Si j'ai le temps un jour, je te donnerai un exemple.
    [/HS]
    (meme si c'est HS, c'est intéressant)
    Oki, d'un autre coté, c'est plus sur les regex compliqué que l'on veut connaitre la rapidité, sachant que sur une regex simple, ca ira vite de toute façon

  9. #9
    Membre actif Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Points : 224
    Points
    224
    Par défaut
    Désolé pour le délai mais j'ai pas recu la notification (ou alors elle est partie dans le spam Faut que je vérifie)

    Voici la dernière version (n'oublions pas que le but n'est pas de créer une fonction de test d'adresse mail mais de comprendre les RegExp)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $adresse = 'm.test@mon-fai.fr';
    $texte = 'Cette chaine : '. $adresse . ' contient un mail';
     
    echo '<strong>VERSION PCRE</strong>' . '<br /><br />'; 
    if (preg_match('`^[\w][\w\.-]+@[\w\.-]+\.[a-z]{2,4}$`i', $adresse))
        echo $adresse . ' est valide.<br /><br />';
    else
        echo $adresse . ' est invalide.<br /><br />';
     
    if (preg_match('`\s([\w][\w\.-]+)@([\w\.-]+\.[a-z]{2,4})\s`i', $texte, $regs)) 
    {
        echo 'On a trouvé l\'adresse ' . $regs[0] . ' dans "' . $texte . '"<br />'; 
        echo 'LOGIN : ' . $regs[1] . ' - '; 
        echo 'DOMAINE : ' . $regs[2] . '<br /><br />'; 
    } 
    else
        echo 'aucune adresse e-mail dans cette chaîne.<br /><br />';
    print_r($regs);
    echo '<br /><br />';
    Ainsi "m.test@monfai.fr" et "m-test@mon-fai.fr" passent bien tandis que
    ".m.test@monfai.fr" est bloquée (le point au début)

    Vous remarquerez pour pour retrouver l'adresse mail dans la phrase, j'ai du ajouter "\s" au début et à la fin. Sinon, l'adresse ".m.test@monfai.fr" était bien trouvé puisque le point de départ était considérée "hors pattern".

    J'ai également limité la longueur du domaine ( "{2,4}" ) car si la phrase était "Cette chaine : m.test@mon-fai.frcontient un mail" (remarquez l'espace oublié entre le fr et le mot suivant), le test trouvait l'adresse "m.test@mon-fai.frcontient"

    Mais je ne sais toujours pas si' j'ai saisi correctement mes "tirets (-)" dans les plages de valeurs ou s'il faut plutot les écrire "[\w\.\-]" ?

    Citation Envoyé par Yogui
    Juste au cas où le lien serait passé inaperçu malgré sa présence dans la FAQ
    En fait j'ai fait mes recherches de tuto sur Google et je suis passé à coté
    il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
    Des fois ça malche, des fois ça malche pas. Garcimore

Discussions similaires

  1. tester envoi mail pour un site local
    Par bouchra19 dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 30/05/2012, 11h53
  2. Tester existence mail via socket
    Par dubitoph dans le forum Langage
    Réponses: 5
    Dernier message: 06/11/2011, 23h33
  3. regex pour tester un mail ou une URL
    Par rambc dans le forum Général Python
    Réponses: 10
    Dernier message: 23/02/2010, 12h37
  4. [smtplib] Tester un mail
    Par rambc dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 25/02/2009, 16h36
  5. [VS 2005] Tester un Mail
    Par D4rkTiger dans le forum Windows Forms
    Réponses: 9
    Dernier message: 28/09/2007, 13h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo