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 :

Extraction chaine ou debut d'adresse mail [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut Extraction chaine ou debut d'adresse mail
    Bonjour,
    Alors voila la chaine:
    Soit:
    benjy cerede2000@toto.fr
    Soit:
    cerede2000@toto.fr
    Dans le premier cas je veut récupérer "benjy", dans le deuxième "cerede2000".
    Voici la regex que j'ai fait pour le moment mais evidemment elle ne me donne pas ce que je veut pas loin quand même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '`^(\b[0-9a-zA-Z\.\-_ ]*\b)|(\w(?:[-_.]?\w)*@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4}))$`', 'benjy cerede2000@toto.fr'
    Merci
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  2. #2
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match('`^(\w(?:[-_. ]?\w)* )?(\w(?:[-_.]?\w)*)@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4})$`', $mail, $out);
    Pour $mail = 'benjy cerede2000@toto.fr';
    print_r me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Array ( [0] => benjy cerede2000@toto.fr [1] => benjy [2] => cerede2000 )
    Pour $mail = 'cerede2000@toto.fr';
    print_r me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Array ( [0] => cerede2000@toto.fr [1] => [2] => cerede2000 )
    Y a t'il un moyen d'eviter d'avoir une case du tableau vide?
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  3. #3
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    peut-être en t'aidant de strrpos($mail,' ') pour trouver le dernier espace.

    une suggestion de regex si j'ai bien compris le but.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match('`^(\w(?:[-_. ]?\w)* (?!@)|\w(?:[-_.]?\w)*)(?:\w(?:[-_.]?\w)*)?@\w(?:[-_.]?\w)*\.[a-z]{2,4}$`', $mail, $out);

  4. #4
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Eu non ta REGEX n'est pas bonne et puis c'est quoi le ?!@
    J'ai reussi pour ma REGEX mon seul probleme c'est la case vide du tableau, j'aurai aimé ne plus l'avoir mais bon...
    Je fait avec
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  5. #5
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    Citation Envoyé par cerede2000
    Eu non ta REGEX n'est pas bonne
    alors je n'ai pas compris ton but. je croyais que les cas suivant

    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
     
     
    $mails[]='cerede2000@toto.fr';
    $mails[]='banjy cerede2000@toto.fr';
    $mails[]='banjo banjy cerede2000@toto.fr';
     
    echo '<pre>';
     
    foreach($mails as $mail) {
      if(preg_match('`^(\w(?:[-_. ]?\w)* (?!@)|\w(?:[-_.]?\w)*)(?:\w(?:[-_.]?\w)*)?@\w(?:[-_.]?\w)*\.[a-z]{2,4}$`',$mail,$out)) {
        print_r($out);
      }
    }
     
    echo '</pre>';
    devait produire

    Array
    (
    [0] => cerede2000@toto.fr
    [1] => cerede2000
    )
    Array
    (
    [0] => banjy cerede2000@toto.fr
    [1] => banjy
    )
    Array
    (
    [0] => banjo banjy cerede2000@toto.fr
    [1] => banjo banjy
    )
    Citation Envoyé par cerede2000
    et puis c'est quoi le ?!@
    une négation pour ne pas valider un cas comme
    banjy @toto.fr
    une assertion négative ne déplace pas le curseur sur la chaine source, contrairement à une classe [^@] qui elle fera le déplacement.

    Citation Envoyé par cerede2000
    J'ai reussi pour ma REGEX mon seul probleme c'est la case vide du tableau,
    toutes les captures dans une regex produisent obligatoirement un résultat, vide s'il n'y avait pas de concordance. la seule manière est de réécrire la regex pour faire 1 seule capture d'où ma suggestion.

  6. #6
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Ah effectivement c'est ce que je voulais j'avais pas fais assez attention méa culpa.
    Merci a toi daniel61
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  7. #7
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Non c'est bien ce qu'il me semblait ta REGEX ne fonctionne pas comme je le voulais...
    Si on a
    $mail = 'benjy cerede2000@toto.fr';
    Je doit recupere benjy et cerede2000@toto.fr
    Et si on a
    $mail = 'cerede2000@toto.fr';
    Je doit recupere cerede2000 et cerede2000@toto.fr
    Donc pour le moment il y a juste ca qui me donne satisfaction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('`^(\w(?:[-_. ]?\w)* )?(\w(?:[-_.]?\w)*)@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4})$`', $mail, $out);
    Mais j'ai le probleme de la case vide dans le cas de ca:
    $mail = 'cerede2000@toto.fr';
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  8. #8
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    Citation Envoyé par cerede2000
    Si on a
    $mail = 'benjy cerede2000@toto.fr';
    Je doit recupere benjy et cerede2000@toto.fr
    les captures semblent être sur benjy et cerede2000... @toto.fr est à oublier?

    Citation Envoyé par cerede2000
    Donc pour le moment il y a juste ca qui me donne satisfaction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('`^(\w(?:[-_. ]?\w)* )?(\w(?:[-_.]?\w)*)@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4})$`', $mail, $out);
    Mais j'ai le probleme de la case vide dans le cas de ca:
    $mail = 'cerede2000@toto.fr';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        if(empty($out[1])) {array_splice($out,1,1);}
    sinon, preg_split() peut détruire les éléments vides.

    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
     
    $mails[]='cerede2000@toto.fr';
    $mails[]='benjy cerede2000@toto.fr';
    $mails[]='bbbbb benjy cerede2000@toto.fr';
    $mails[]='pas bon';
     
    $options=PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE;
     
    echo '<pre>';
     
    foreach($mails as $mail) {
      $out=preg_split('`^((\w(?:[-_. ]?\w)* )?(\w(?:[-_.]?\w)*)@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4}))$`',$mail,-1,$options);
      if(count($out)>1) { // email pas valide si 1 seul élément
        print_r($out);
      }
    }
     
    echo '</pre>';

  9. #9
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    bon, je viens d'apprendre quelque chose si la dernière capture est en répétition ? et que cette capture est vide alors preg_match ne génère pas de résultat pour cette capture.

    exemples simplifiés:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    echo '<pre>';
     
    preg_match('#^(\w+ |\w+)(\w+)?@\w+\.\w+$#','b@c.d',$ref);
    print_r($ref);
     
    preg_match('#^(\w+ |\w+)(\w+)?@\w+\.\w+$#','a b@c.d',$ref);
    print_r($ref);
     
    echo '</pre>';
    produira

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Array
    (
        [0] => b@c.d
        [1] => b
    )
    Array
    (
        [0] => a b@c.d
        [1] => a 
        [2] => b
    )
    avec tes motifs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_match('`^(\w(?:[-_. ]?\w)* (?!@)|\w(?:[-_.]?\w)*)(\w(?:[-_.]?\w)*)?@\w(?:[-_.]?\w)*\.[a-z]{2,4}$`', $mail, $out)
    produira

    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
     
    Array
    (
        [0] => cerede2000@toto.fr
        [1] => cerede2000
    )
    Array
    (
        [0] => benjy cerede2000@toto.fr
        [1] => benjy 
        [2] => cerede2000
    )
    Array
    (
        [0] => bbbbb benjy cerede2000@toto.fr
        [1] => bbbbb benjy 
        [2] => cerede2000
    )
    par contre, il serait peut-être bon de vérifier si c'est le comportement voulu avant utilisation... pour éviter un changement de comportement après correction d'un bug dans une version future de php et/ou pcre. à toi de voir.

  10. #10
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Eu sur les deux réponses j'ai rien comprit
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  11. #11
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    désolé... il y a 3 suggestions en fait. la première:
    if(empty($out[1])) {array_splice($out,1,1);}

    empty() permet d'évaluer si le contenu d'une variable est vide ou non, empty($out[1]) retournera true si $out[1] est vide... le cas de ton preg_match sur $mail = 'cerede2000@toto.fr';

    array_splice() permet en autre de détruire un ou plusieurs éléments dans un array.

    le premier paramètre est le array sur lequel il faut travailler, dans ton cas $out.

    le second paramètre est l'indice de ce array ou il faut débuter. dans ton cas c'est 1 pour $out[1].

    le dernier paramètre est le nombre d'éléments à enlever. 1 seul élément est à enveler dans le cas de ton preg_match sur $mail = 'cerede2000@toto.fr';

    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $mails[]='cerede2000@toto.fr';
    $mails[]='benjy cerede2000@toto.fr';
     
    echo '<pre>';
     
    foreach($mails as $mail) {
      if(preg_match('`^(\w(?:[-_. ]?\w)* )?(\w(?:[-_.]?\w)*)@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4})$`', $mail, $out)) {
        if(empty($out[1])) {array_splice($out,1,1);}
        print_r($out);
      }
    }
     
    echo '</pre>';
    produira:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Array
    (
        [0] => cerede2000@toto.fr
        [1] => cerede2000
    )
    Array
    (
        [0] => benjy cerede2000@toto.fr
        [1] => benjy 
        [2] => cerede2000
    )
    ce qui enleve le vide que tu ne voulais pas dans le cas de $mail = 'cerede2000@toto.fr';

  12. #12
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Oui ca enleve le vide, mais ca ne recupere plus l'adresse mail toute seule.
    Hors j'en ai aussi besoin
    Et j'ai deja une méthode pour traiter la case vide, donc ca ou array_slice...
    Si on ne peut pas le faire a partir de la REGEX alors tant pit
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraction fichier (xls) depuis adresse mail
    Par mano_bi dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 28/02/2014, 14h49
  2. [RegEx] Crypter les adresses mail dans une chaine
    Par link.80 dans le forum Langage
    Réponses: 4
    Dernier message: 26/01/2012, 18h12
  3. [Mail] Comment extraire une adresse mail d'une chaine
    Par pymouse dans le forum Langage
    Réponses: 8
    Dernier message: 29/05/2006, 11h57
  4. [VBA][outlook] récupération des adresses mail
    Par arno2004 dans le forum VBA Outlook
    Réponses: 4
    Dernier message: 27/07/2004, 18h48
  5. [VB6] procédure de vérification d'adresse mail ?
    Par ghohm dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 07/06/2004, 13h05

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