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 :

Isoler les lignes de redirection d'un ficher type alias mail (Postfix ou autre) [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 173
    Points : 88
    Points
    88
    Par défaut Isoler les lignes de redirection d'un ficher type alias mail (Postfix ou autre)
    Bonjour,

    je souhaiterais récupérer certaine ligne d'un ficher alias, à savoir celle qui on la structure suivante :

    adresse_mail : adresse_mail1

    ou

    adresse_mail : adresse_mail1 , adresse_mail2,adresse_mail3 ...


    j'ai mis des espace supplémentaire juste pour dire qu'il peut y en avoir mais leur nombre ou leur existence n'a que peut d'intérêt dans le ficher et que je les fais sauter dans le traitement qui suit

    merci de votre aide

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Ok, partons d'une sous pattern naïve qui évite les : et les ,, décrivant une adresse email (une pattern rigoureuse décrivant une adresse email fait une page de long): [^\s@]+@[^\s:,]+
    On met cette sous pattern dans un groupe de capture (\S+@[^\s:,]+) pour éviter d'avoir à la réécrire en s'y référant avec (?1).

    Il faut décrire la structure de la ligne (addresse: adresse,adresse...), le tout avec des espaces optionels partout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?m)^\h*([^\s@]+@[^\s:,]+)\h*:(?:\h*(?1)\h*(?:,|\Z))+\Z
    Explication des symboles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (?m)    # le modificateur m place la pattern en mode multiline, cela signifie que l'ancre ^ correspond au début d'une ligne (par défaut c'est le début de la chaîne)
    \h      # classe de caractère regroupant tous les caractères blancs horizontals (espaces, tabulations et autres déclinaisons de la table unicode)
    \Z      # ancre pour la fin de ligne quelque soit le mode (multiline ou pas) (plus pertinent que $ qui autorise un saut de ligne en fin de chaîne)

    Si tu souhaites extraire les alias pour une adresse email un par un, tu peux faire ça:

    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
    $pattern = <<<'EOD'
    ~
        (?(DEFINE)
            (?<mail> [^\s@]+@[^\s:,]+ )  # si tu veux une meilleur description d'un mail, il suffit de la modifier ici
            (?<aliases> (?: \h* \g<mail> \h* (?:,|\Z) )+ \Z )
        )
        (?:
            ^ \h* (?<email> \g<mail> ) \h* : (?=\g<aliases>)
          |
            (?!\A)\G [\h,]*
        )
        (?<alias> \g<mail> )
    ~mx
    EOD;
     
    if (preg_match_all($pattern, $filecontent, $matches, PREG_SET_ORDER)) {
        foreach ($matches as $match) {
            echo PHP_EOL . ((empty($match['mail'])) ? '' : $match['mail'] . ':') . "\t" . $match['alias'];
        }
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 173
    Points : 88
    Points
    88
    Par défaut
    Bonjour,

    Un grand merci pour cette reponse qui fonctionne parfaitement en l'etat,

    j'aurais juste une petite question supplementaire,

    si je voulais faire un preg_match_all afin de recuperer le mail et les alias de la facon suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto@free.fr    :     toto1@free.fr      ,          toto2@free.fr,                  toto3@free.fr


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mail : toto@free.fr 
    alias :      toto1@free.fr      ,          toto2@free.fr,                  toto3@free.fr

    j'ai supposé qui me fallais juste enleve (?: du deuxième groupe pour qu'il soit matché.

    sauf que dans mon cas j'obtiens cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mail : toto@free.fr
    alias :                   toto3@free.fr


    comment cela ce fait t'il ? alors que cela fonctionne si les espace ni sont pas.


    derniere question subsidiaire :

    arriver a :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mail : toto@free.fr 
    alias : toto1@free.fr,toto2@free.fr,toto3@free.fr
    directement grace a la regexp est ce possible ou est ce que je dois trimmer les resulats



    d'avance merci

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Eh oui, ça ne peut pas marcher, car quand on répète un groupe de capture avec un quantificateur, à chaque itération, la nouvelle capture remplace l'ancienne. C'est pour cela que tu obtiens uniquement le dernier alias.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?m)^\h*([^\s@]+@[^\s:,]+)\h*:(?:\h*(?1)\h*(?:,|\Z))+\Z

    En fait, ce pattern est conçu à la base pour trouver tout une ligne au format voulu, il n'est pas trop fait pour isoler les éléments, l'utilisation du groupe capturant n'est là que pour éviter de décrire à nouveau la partie mail . Par contre, on peut facilement extraire l'email et l'ensemble de ses alias, mais en un seul bloc, en rajoutant un groupe de capture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?m)^\h*([^\s@]+@[^\s:,]+)\h*:((?:\h*(?1)\h*(?:,|\Z))+)\Z
    Tu peux alors aboutir au résultat souhaité en partant de ce pattern, mais pour enlever les espaces tu devras faire une manipulation supplémentaire sur le deuxième groupe de capture, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (preg_match_all('~^\h*([^\s@]+@[^\s:,]+)\h*:((?:\h*(?1)\h*(?:,|\Z))+)\Z~m', $filecontent, $matches, PREG_SET_ORDER)) {
        foreach ($matches as $match) {
            echo  PHP_EOL . 'mail : ' . $match[1] . PHP_EOL . 'alias : ' . strtr($match[2], array(' '=>'', "\t"=>''));
        }
    }
    (NB: si strtr() ne suffit pas à enlever tous les caractères blancs, on peut le remplacer par un preg_replace('~\h+~', '', $match[2]))

    En revanche le deuxième pattern n'a pas besoin de cette manipulation car il capture isolément les alias:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (preg_match_all($pattern, $filecontent, $matches, PREG_SET_ORDER)) {
        foreach ($matches as $match) {
            echo ((empty($match['mail']) ? ',' : PHP_EOL . 'mail : ' . $match['mail'] . PHP_EOL . 'alias : ') . $match['alias'];
        }
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 173
    Points : 88
    Points
    88
    Par défaut
    Merci beaucoup !!!

    je me suis pemis de faire quelque modif pour que cela fonctionne chez moi :

    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
     
    <?PHP
     
    $fichier = file_get_contents("alias.txt");
     
    if (preg_match_all('/^\h*([a-zA-Z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}+)\h*:((?:\h*(?1)\h*(?:,[^,$?]|$))+)+$/m',$fichier,$aliases))
    {	
     
    	foreach ($aliases[1] as $key => $value){
    	 $source=trim($aliases[1][$key]);
         $destination=array_map('trim', explode(',', $aliases[2][$key]));
     
    	 echo "source : ".$source." destination : ".implode(',',$destination)."<br>";
     
     
     
    	}
    }
     
    ?>
    resultat nikel

    encore un grand merci !!!

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    À la bonne heure!

    Remarques que j'ai remplacé le \S par [^\s@] pour éviter des efforts inutiles au moteur de regex.

    Attention avec [a-zA-Z0-9._-] tu risques de manquer les emails un peu exotiques. Dans ce contexte, tu n'as pas besoin de valider précisément la syntaxe des adresses email.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. Comment isoler ces lignes avec les expressions régulières?
    Par Benka dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 01/07/2010, 18h10
  2. Réponses: 5
    Dernier message: 18/03/2009, 19h31
  3. [C#] Compter les lignes d'un DataSet
    Par alexischmit dans le forum ASP.NET
    Réponses: 13
    Dernier message: 26/04/2004, 15h17
  4. Réponses: 3
    Dernier message: 26/04/2004, 12h51
  5. determiner les ligne visible ds un RichEdit
    Par hhfr dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/09/2002, 18h15

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