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 :

regex sur une chaine multilignes [RegEx]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 35
    Points
    35
    Par défaut regex sur une chaine multilignes
    Bonjour à tous

    Etant un grand débutant, j'éprouve beaucoup de difficultés à trouver la bonne expression régulière pour sur une chaine multilignes du type :

    19/10/16 10:28 ALPHA->BETA : Demande d'intervention pour une maintenance N1-N2 envoyée à la région
    26/10/16 10:00 ALPHA : Intervention prévu entre le 26/10 et le 04/11
    02/11/16 15:03 BETA => ALPHA : Aucune nouvelle
    Conseil : attendre jusqu'au 4/11. Rappeler lundi 07/11 si aucune intervention
    07/11/16 12:08 ALPHA=>BETA=>GP : Tentative de joindre le GP sans succès, nouvelle tentative dans la journée.
    10/11/16 15:58 ALPHA->BETA : Le 10/11 Nous demandons la modification de l'avis en niveau 3 (ZETA).
    17/11/16 16:15 ALPHA : relance du BETA.
    18/11/16 10:06 BETA=>ALPHA : Le BETA nous informe que l'ZETA interviendra dans 3 semaines dans la S49
    01/12/16 11:44 ZETA->ALPHA : Intervention sans succès.
    Demande de nouvelle inter pour chgt de carte en défaut
    08/12/16 14:11 ALPHA <=> BETA : Aucune information sur la carte
    Toujours en attente de réception
    Aucune intervention de prévue dans l'immédiat
    15/12/16 10:30 ALPHA -> BETA : Relance du BETA pour avoir une date de réception des ventilos.
    appel à 10h30 et 14h00... attente retour.
    21/12/16 16:25 ALPHA=>BETA : Relance du BETA pour l'intervention du changement de la carte synth
    28/12/16 14:06 ALPHA <=> BETA : Rupture de stock du lot de maintenance pour la carte SYNTH.
    Dès que le lot sera renouvelé, le BETA nous informera par mail afin de planifier une intervention.
    19/01/17 10:36 ALPHA->BETA : Relance BETA : Toujours pas de lot de maintenance
    02/02/17 14:54 ALPHA->BETA : Relance BETA : Toujours pas de lot de maintenance
    08/02/17 14:09 BETA <=> ALPHA : Le BETA envoi une carte SYNTH à l'ZETA.
    On n'a pas encore de date pour l'intervention.
    14/02/17 10:20 ALPHA -> BETA : Relance vers le BETA pour avoir une date de planif
    14/02/17 10:45 BETA -> ALPHA : intervention prévue le 23/02
    mon objectif est d'extraire toute les chaines commençant par une date jusqu'à la suivante

    ce qui donnerait :

    capture #1 : 19/10/16 10:28 ALPHA->BETA : Demande d'intervention pour une maintenance N1-N2 envoyée à la région

    capture #2 : 26/10/16 10:00 ALPHA : Intervention prévu entre le 26/10 et le 04/11

    capture #3 : 02/11/16 15:03 BETA => ALPHA : Aucune nouvelle
    Conseil : attendre jusqu'au 4/11. Rappeler lundi 07/11 si aucune intervention

    capture #4 : 07/11/16 12:08 ALPHA=>BETA=>GP : Tentative de joindre le GP sans succès, nouvelle tentative dans la journée.

    capture #5 : 10/11/16 15:58 ALPHA->BETA : Le 10/11 Nous demandons la modification de l'avis en niveau 3 (ZETA).

    capture #6 : 17/11/16 16:15 ALPHA : relance de BETA.

    capture #7 : 18/11/16 10:06 BETA=>ALPHA : Le BETA nous informe que l'ZETA interviendra dans 3 semaines dans la S49

    capture #8 : 01/12/16 11:44 ZETA->ALPHA : Intervention sans succès.
    Demande de nouvelle inter pour chgt de carte en défaut

    capture #9 : 08/12/16 14:11 ALPHA <=> BETA : Aucune information sur la carte
    Toujours en attente de réception
    Aucune intervention de prévue dans l'immédiat

    capture #10 : 15/12/16 10:30 ALPHA -> BETA : Relance du BETA pour avoir une date de réception des ventilos.
    appel à 10h30 et 14h00... attente retour.

    capture #11 : 21/12/16 16:25 ALPHA=>BETA : Relance du BETA pour l'intervention du changement de la carte synth
    28/12/16 14:06 ALPHA <=> BETA : Rupture de stock du lot de maintenance pour la carte SYNTH.

    capture #12 : Dès que le lot sera renouvelé, le BETA nous informera par mail afin de planifier une intervention.

    capture #13 : 19/01/17 10:36 ALPHA->BETA : Relance BETA : Toujours pas de lot de maintenance

    capture #14 : 02/02/17 14:54 ALPHA->BETA : Relance BETA : Toujours pas de lot de maintenance

    capture #15 : 08/02/17 14:09 BETA <=> ALPHA : Le BETA envoi une carte SYNTH à l'ZETA.
    On n'a pas encore de date pour l'intervention.

    capture #16 : 14/02/17 10:20 ALPHA -> BETA : Relance vers le BETA pour avoir une date de planif

    capture #17 : 14/02/17 10:45 BETA -> ALPHA : intervention prévue le 23/02
    j'ai essayé d'utiliser quelque chose comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    /(\d{2}\/\d{2}\/\d{2}\s+\d{2}:\d{2}\s+)(.*)[^(\d{2}\/\d{2}\/\d{2}\s+\d{2}:\d{2}\s+.*)]/g
     
    ou bien 
     
    /(\d{1,2}\/\d{1,2}\/\d{1,2}\s+\d{1,2}:\d{1,2}\s+)(.*(\r|\t|\n).*)(?=\d{1,2}\/\d{1,2}\/\d{1,2}\s+\d{1,2}:\d{1,2}\s+)/g
    merci d'avance pour votre aide

    cordialement

  2. #2
    Membre émérite
    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
    Points : 2 522
    Points
    2 522
    Par défaut
    Essaie ça.
    tutu.txt contient le texte que tu as posté.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    $texte = file_get_contents('tutu.txt');
    $texte .= "\r\n";
    $pattern = "/([0-9]{2}\/[0-9]{2}\/[0-9]{2}.*)\\r\\n/m";
    preg_match_all($pattern,$texte,$array);
    //var_dump($array[1]);
    foreach($array[1] as $key => $value) {
     print "Capture ".($key +1)." $value<br/>";
     
    }
    ?>
    Donne :
    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
     
    Capture 1 19/10/16 10:28 ALPHA->BETA : Demande d'intervention pour une maintenance N1-N2 envoyée à la région
    Capture 2 26/10/16 10:00 ALPHA : Intervention prévu entre le 26/10 et le 04/11
    Capture 3 02/11/16 15:03 BETA => ALPHA : Aucune nouvelle
    Capture 4 07/11/16 12:08 ALPHA=>BETA=>GP : Tentative de joindre le GP sans succès, nouvelle tentative dans la journée.
    Capture 5 10/11/16 15:58 ALPHA->BETA : Le 10/11 Nous demandons la modification de l'avis en niveau 3 (ZETA). 
    Capture 6 17/11/16 16:15 ALPHA : relance du BETA. 
    Capture 7 18/11/16 10:06 BETA=>ALPHA : Le BETA nous informe que l'ZETA interviendra dans 3 semaines dans la S49
    Capture 8 01/12/16 11:44 ZETA->ALPHA : Intervention sans succès.
    Capture 9 08/12/16 14:11 ALPHA <=> BETA : Aucune information sur la carte 
    Capture 10 15/12/16 10:30 ALPHA -> BETA : Relance du BETA pour avoir une date de réception des ventilos.
    Capture 11 21/12/16 16:25 ALPHA=>BETA : Relance du BETA pour l'intervention du changement de la carte synth
    Capture 12 28/12/16 14:06 ALPHA <=> BETA : Rupture de stock du lot de maintenance pour la carte SYNTH.
    Capture 13 19/01/17 10:36 ALPHA->BETA : Relance BETA : Toujours pas de lot de maintenance
    Capture 14 02/02/17 14:54 ALPHA->BETA : Relance BETA : Toujours pas de lot de maintenance
    Capture 15 08/02/17 14:09 BETA <=> ALPHA : Le BETA envoi une carte SYNTH à l'ZETA.
    Capture 16 14/02/17 10:20 ALPHA -> BETA : Relance vers le BETA pour avoir une date de planif
    Capture 17 14/02/17 10:45 BETA -> ALPHA : intervention prévue le 23/02
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Merci beaucoup pour cette réponse rapide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    *
    <?php
    $texte = file_get_contents('tutu.txt');
    $texte .= "\r\n";
    $pattern = "/([0-9]{2}\/[0-9]{2}\/[0-9]{2}.*)\\r\\n/m";
    preg_match_all($pattern,$texte,$array);[ATTACH=CONFIG]253178[/ATTACH][ATTACH=CONFIG]253183[/ATTACH]
    //var_dump($array[1]);
    foreach($array[1] as $key => $value) {
     print "Capture ".($key +1)." $value<br/>";
    *
    }
    ?>
    d'après ce que je comprends le texte à analyser se trouve dans tutu.txt (joli nom ) et tu ajoutes \r\n à la fin

    tu cherches ensuite le pattern suivant : (0-9)(0-9)/(0-9)(0-9)/(0-9)(0-9)(suivi de n'importe quoi ou pas)se terminant littéralement par "\r\m" en mode multiline et tu extrais les "matches"

    J'ai tenté d'utiliser ton travail mais sans succès :/ excuse mon manque de savoir sur le sujet :

    Nom : 1.png
Affichages : 150
Taille : 64,0 Ko


    je me demande si j'ai été suffisamment clair avec mon soucis
    ce qui me pose souci apparemment c'est le fait la chaine se trouve sur plusieurs lignes.
    le mieux que j'ai pu faire c'est le résultat ci-dessous. Mais certaines ne matchent pas (en blanc)

    Nom : 2.png
Affichages : 147
Taille : 78,0 Ko


    mon but c'est d'avoir un match par timestamp d'une date jusqu'à la prochaine mais sans l'inclure (la prochaine)

    dans l'espoir d'avoir été plus clair


    merci encore pour ton aide

  4. #4
    Membre émérite
    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
    Points : 2 522
    Points
    2 522
    Par défaut
    Désolé. J'avais mal lu ta demande.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  5. #5
    Membre émérite
    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
    Points : 2 522
    Points
    2 522
    Par défaut
    Ca devrait mieux le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    $texte = file_get_contents('tutu.txt');
    $pattern = "/([0-9]{2}\/[0-9]{2}\/[0-9]{2}.*?)(?=[0-9]{2}\/[0-9]{2}\/[0-9]{2})/ms";
    preg_match_all($pattern,$texte,$array);
    foreach($array[1] as $key => $value) {
     $value = nl2br($value);
     print "Capture #".($key +1).": $value<br/>";
    }
    ?>
    Donne :

    Nom : 170312-001.JPG
Affichages : 141
Taille : 117,0 Ko
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  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
    Deux techniques différentes:

    1) on charge le fichier en entier dans une variable, puis on coupe la chaîne à chaque saut de ligne suivi d'une date:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $filePath = 'interv.log';
    $data = rtrim(file_get_contents($filePath));
    $records = preg_split('~\R(?=\d\d/\d\d/\d\d \d\d:\d\d )~', $data);
     
    print_r($records);
    \R est un alias pour plusieurs types de séquences de saut de ligne (Windows: \r\n, unix/linux: \n, anciens Mac: \r).
    (?=...) est un lookahead (un test avant), qui vérifie que l'expression précédente (en l'occurrence le \R) est bien suivie par la sous-pattern qu'il contient.

    Avantages/Inconvenients: C'est rapide et simple à écrire et maniable, mais c'est gourmand en mémoire puisque le contenu du fichier est stocké dans son intégralité dans une variable, puis ensuite tous les enregistrements dans un tableau.

    2) On lit le fichier ligne par ligne (technique dite du lazy loading) et on délègue à un générateur la tâche de fournir les enregistrements:
    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
    function getNextRecord($fh) {
        if ( false === $record = fgets($fh) )
    	return false;
     
        while ( false !== $line = fgets($fh) ) {
            if ( preg_match('~^\d\d/\d\d/\d\d \d\d:\d\d ~', $line) ) {
                yield $record;
                $record = $line;
            } else {
                $record .= $line;
            }
        }
        yield $record;
    }
     
    $fh = fopen($filePath, 'r');
    foreach (getNextRecord($fh) as $record) {
        echo $record, PHP_EOL;
    }
    fclose($fh);
    Avantages/Inconvénients: la consommation de mémoire reste ridicule même avec un gros fichier car rien n'est stocké, tout est lu, éventuellement traité et restitué au fur et à mesure. Le fait de ne pas avoir de tableau stockant chaque enregistrement est une contrainte (ceci-dit rien n'empêche d'en créer un dans la boucle foreach). Si on peut voir cela comme un inconvénient, car c'est moins maniable, on peut aussi le voir comme un avantage quasi orthopédique qui oblige à un design de code orienté flux (concrètement au lieu de tout faire en bloc, on s'arrange pour faire tous les traitements dans la boucle foreach ou dans le générateur).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Merci à tous les deux pour votre temps est vos explications qui m'ont été très utiles !

    (Navré de répondre que maintenant j'ai été très occupé)

    bonne continuation

    cordialement

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/07/2011, 05h35
  2. Question sur les Regex. interdire une chaine
    Par cysboy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/05/2007, 13h49
  3. Masque sur une chaine
    Par Weedo dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 10/01/2006, 11h32
  4. Erreur de segmentation sur une chaine en récursif...
    Par laurent_ifips dans le forum C
    Réponses: 12
    Dernier message: 13/12/2005, 16h04
  5. [Débutant][String] Opérations sur une chaîne
    Par gandalf_le_blanc dans le forum Général Java
    Réponses: 8
    Dernier message: 08/06/2004, 11h59

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