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 :

Aide pour modifier une Regex svp [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2019
    Messages : 4
    Par défaut Aide pour modifier une Regex svp
    Bonjour à tous,

    J'utilise une regex pour filtrer un fichier contenant deux chaines séparées par ":" par ligne soit "chaine1:chaine2", afin que "chaine1" contienne un "@" et "chaine2" au moins une majuscule :

    ^[^:@?]*[@?][^:]*:.*?[A-Z].*?

    Le "@" pour extraire uniquement les emails vous l'aurez compris, mais j'aimerais maintenant ajouter le fait de ne cibler que les adresses françaises.

    De préférence "chaine1" fini par ".fr"
    Ou alors, la ligne contient ".fr:"

    Merci pour votre aide

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Essaie ça.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $pattern = "/^[^@]+[@].+\.fr:.*?[A-Z].*?$/";$texte   = "toto@titi.fr:arRivAge";
    preg_match_all($pattern,$texte,$arr);
    var_dump($arr);

    Mais nul doute que si Cosmoknacki passe par ici il trouvera mieux.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2019
    Messages : 4
    Par défaut
    Merci badaze ! Sympa, cela fonctionne parfaitement comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^[^@]+[@].+\.fr:.*?[A-Z].*?$
    Par contre me suis rendu compte que j’oubliais certains domaines, tel que laposte.net, ce serait possible de l’ajouter à cette expression par exemple ?

    Je peux ajouter les .net comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^[^@]+[@].+((\.fr:)|(\.net:)).*?[A-Z].*?$
    Mais je n’arrive pas avec laposte.net.

    Je pourrai peut-être même comprendre la logique, et savoir modifier comme un grand à l’avenir sans vous embêter.

    Merci beaucoup

  4. #4
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Comme ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $pattern = "/^[^@]+[@].+\.(?:fr|net):.*?[A-Z].*?$/";$texte   = "toto@titi.net:arRivAge";
    preg_match_all($pattern,$texte,$arr);
    var_dump($arr);
    ?: indique que le groupe entre les () n'est pas capturant. Essaie le code tel quel avec et sans ?: et tu comprendras.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2019
    Messages : 4
    Par défaut
    Merci pour ta proposition badaze, mais elle match tous les domaines .net et pas seulement les laposte.net, j’ai essayé multiples combinaisons (au doigt mouillé) sans succès, je crois que c’est le "." (point) de laposte.net qui me gêne...

  6. #6
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $pattern = "/^[^@]+[@](?:.+\.fr|laposte\.net):.*?[A-Z].*?$/";

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 994
    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 994
    Par défaut
    Une manière de filtrer un fichier est d'utiliser le filtrage de flux. Il est possible de définir des filtres personnalisés en étendant la classe php_user_filter.
    Ici je crée un filtre pour les lignes ne satisfaisant pas aux critères: la pattern est donc "inversée" pour chercher les mauvaise lignes et utilisée avec preg_replace pour les effacer.

    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
    class MonFiltre extends php_user_filter
    {
        const Pattern = '~ (?n) # les groupes sont non-capturants
            ^
                [^ @ : \r \n ]*+
                ( [^ @ \r \n ]* | @ [^ : \r \n ]*+ 
                    ( (?<! \. fr | [ @ . ] laposte\.net ) : .* | : [^ A-Z \r \n ]* )
                )
            $ \R? ~mxx';
     
        public function filter($in, $out, &$consumed, $closing) {
            while ( $bucket = stream_bucket_make_writeable($in) ) {
                $bucket->data = preg_replace(self::Pattern, '', $bucket->data);
                $consumed += $bucket->datalen;
                stream_bucket_append($out, $bucket);
            }
            return PSFS_PASS_ON;
        }
    }
     
    stream_filter_register('mon_filtre', 'MonFiltre');
    Une fois ce filtre défini, il suffit de changer l'URL de disons monfichier.txt à php://filter/read=mon_filtre/resource=monfichier.txt. Avec cette URL, c'est comme si on lisait une sorte de fichier virtuel mais contenant uniquement les lignes qui nous intéressent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $handle = fopen('php://filter/read=mon_filtre/resource=mailpass.txt', 'rb');
     
    $mailpass = [];
     
    while ( false !== $line = fgets($handle) ) {
        $mailpass[] = explode(':', rtrim($line, "\r\n"));
    }
     
    fclose($handle);
     
    print_r($mailpass);
    Ici j'ai choisi d'ouvrir le fichier avec fopen pour une lecture ligne par ligne, mais on peut très bien faire la même chose avec file_get_contents.

    Histoire de caser des nouveautés introduites avec PCRE 10.30 (normalement disponible sur les versions 7.3 de PHP), j'ai placé dans la pattern le modificateur (?n) qui rend les groupes de capture non-capturant, ainsi que le modificateur xx qui a le même effet que le modificateur x (espacement libre + commentaires) sauf qu'il autorise en plus les espaces et les tabulations à l'intérieur des classes de caractères.
    Aucun des deux n'est indispensable, donc pour rendre la pattern compatible avec une ancienne version, il suffit d'enlever (?n) et de retirer les espaces des classes de caractères. On peut aussi remplacer xx par x bien que ça ne soit pas utile, car dans ce cas xx est vu comme deux fois le modificateur x, ce qui ne porte pas à conséquence.

  8. #8
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 994
    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 994
    Par défaut
    Sinon, il n'est pas interdit d'utiliser la bonne vieille méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $mailpass = []; 
    $handle = fopen('mailpass.txt', 'rb');
    while ( false !== $line = fgets($handle) ) {
        [$mail, $pass] = explode(':', rtrim($line, "\r\n"));
        if ( strpos($mail, '@') and 
             substr($mail, -3) === '.fr' || substr($mail, -12) === '@laposte.net' and
             strtolower($pass) !== $pass )
            $mailpass[] = [$mail, $pass];
     
    }
    fclose($handle);
     
    print_r($mailpass);

  9. #9
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2019
    Messages : 4
    Par défaut
    Cela fonctionne parfaitement avec le message #6 de badaze, couronné par les conseils de cosmo, sujet on ne peut plus résolu.

    Merci à vous deux pour le temps que vous m’avez accordé

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

Discussions similaires

  1. [RegEx] Besoin d'aide pour construire une regex complexe
    Par Predax dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2013, 09h52
  2. Besoin d'aide pour écrire une regex
    Par kao98 dans le forum Général Python
    Réponses: 4
    Dernier message: 05/03/2010, 16h59
  3. Aide pour modifier une fonction
    Par lcoulon dans le forum Débuter
    Réponses: 1
    Dernier message: 13/10/2009, 16h11
  4. [RegEx] Aide pour créer une regex
    Par lemirandais dans le forum Langage
    Réponses: 2
    Dernier message: 02/08/2009, 17h40
  5. [VB6]besoin d'aide pour modifier une application
    Par mister perfect dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 19/05/2006, 12h46

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