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

JavaScript Discussion :

Regex pour extraire un tableau sérialisé d'un fichier log IPN-Paypal [RegExp]


Sujet :

JavaScript

  1. #1
    Membre régulier Avatar de devEric69
    Homme Profil pro
    Dév. Lazarus & C++, Php - Windows & Ubuntu
    Inscrit en
    Novembre 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Dév. Lazarus & C++, Php - Windows & Ubuntu
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 74
    Points : 121
    Points
    121
    Par défaut Regex pour extraire un tableau sérialisé d'un fichier log IPN-Paypal
    Hello Terretous,

    J'ai un problème de regex javascript qui est le suivant:
    -j'ai une <div> qui m'affiche dans mon navigateur, le contenu d'un fichier log.
    -au sein de ce contenu, j'ai des phrases simples de débogage, et parfois un tableau sérialisé par php.

    Le fichier (pour anecdote, c'est une journalisation du protocole IPN de Paypal) d'où je veux extraire une information pouvant être récurrente est le 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    2016-10-18 10:02:28 - ERR (3): [le 19/10/2016 18:02:25, blabla1
    blabla2]
    DEBUT_POST
    Array
    (
        [item_name] =&gt; smartPhone - The Fonz (avec peigne integre)
        [txn_type] =&gt; cart
        [txn_id] =&gt; 899327589
        [notify_version] =&gt; 2.4
        [custom] =&gt; abc|123
        [invoice] =&gt; abc
        [test_ipn] =&gt; 1
        [verify_sign] =&gt; AFcWxV21C7fd0v3bYYYRCpSSRl31Av8kdf7ABYZs1hQc4YihAjoRqz3V
    )
    FIN_POST
    2016-10-18 11:05:13 - ERR (3): [le 10/10/2016 10:02:25, blabla3
    blabla4]
    2016-10-18 09:12:24 - ERR (3): [le 10/10/2016 10:02:25, blabla5
    blabla6]
    DEBUT_POST
    Array
    (
        [item_name] =&gt; smartPhone - The Fonz (avec peigne integre)
        [txn_type] =&gt; cart
        [txn_id] =&gt; 899327589
        [notify_version] =&gt; 2.4
        [custom] =&gt; xyz|123
        [invoice] =&gt; xyz
        [test_ipn] =&gt; 1
        [verify_sign] =&gt; AFcWxV21C7fd0v3bYYYRCpSSRl31Av8kdf7ABYZs1hQc4YihAjoRqz3V
    )
    FIN_POST
    2016-10-18 15:15:56 - ERR (3): [le 10/10/2016 10:02:25, blabla7
    blabla8]
    2016-10-19 11:05:13 - ERR (3): [le 10/10/2016 10:02:25, blabla9
    10èmeblabla]
    DEBUT_POST
    Array
    (
        [item_name] =&gt; smartPhone - The Fonz (avec peigne integre)
        [txn_type] =&gt; cart
        [txn_id] =&gt; 899327589
        [notify_version] =&gt; 2.4
        [custom] =&gt; abc|123
        [invoice] =&gt; abc
        [test_ipn] =&gt; 1
        [verify_sign] =&gt; AFcWxV21C7fd0v3bYYYRCpSSRl31Av8kdf7ABYZs1hQc4YihAjoRqz3V
    )
    FIN_POST
    2016-10-19 11:05:13 - ERR (3): [le 10/10/2016 10:02:25, blabla9
    10èmeblabla]
    etc, etc
    Pour information, j'utilise cette régularité pour écrire en php côté serveur dans ce fichier *.log:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'DEBUT_POST'.PHP_EOL.serialize($_POST).PHP_EOL.'FIN_POST';
    J'essaie déjà d'extraire la première occurrence du tableau qui contient [invoice] =&gt; abc.
    C'est un tableau multi-lignes, donc j'ai testé en javascript...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sRes = sZeLogFileInDiv.search(/^DEBUT_POST(.*)FIN_POST*/gmi);
    alert(tsRes[1]);
    ...mais elle ne me renvoie que false !?? et ce, seulement pour tenter d'extraire un tableau , sans même le filtre incluant de [invoice] =&gt; abc).

    => Est-ce que quelqu'un voit ce qui est faux dans cette regex (PS: je tiens à utiliser du multi-lines de la forme: ^DEBUT_POST(.*)\[invoice\] =&gt; abc(.*)FIN_POST$ )?

    Cordialement.

  2. #2
    Membre régulier Avatar de devEric69
    Homme Profil pro
    Dév. Lazarus & C++, Php - Windows & Ubuntu
    Inscrit en
    Novembre 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Dév. Lazarus & C++, Php - Windows & Ubuntu
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 74
    Points : 121
    Points
    121
    Par défaut
    ^DEBUT_POST...$
    NB1: je viens déjà de me rendre compte que D et B du mot clé DEBUT_POST appartiennent à la grammaire des regex-javascript et doivent donc en être échappée via un \.

    Benh non, c'est l'inverse: \D et \B ont une signification: "pas un chiffre" et "limite d'un mot" respectivement => le problème ne vient pas de là.

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /DEBUT_POST(\r|\n)+((.*(\r|\n)+))+FIN_POST/gmiu
    groupe de capture 2
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  4. #4
    Membre régulier Avatar de devEric69
    Homme Profil pro
    Dév. Lazarus & C++, Php - Windows & Ubuntu
    Inscrit en
    Novembre 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Dév. Lazarus & C++, Php - Windows & Ubuntu
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 74
    Points : 121
    Points
    121
    Par défaut
    ==> Bingo: ça marche !
    J'écris maintenant des balises spécifiques (DEBUT_POST_abc .../... FIN_POST_abc, ou alors DEBUT_POST_xyz .../... FIN_POST_xyz) avant et après chaque php->serialize(tableau_POST_xxx); pour les taguer "aux yeux de javascript" différemment côté navigateur, et j'arrive à m'en sortir avec cette regex qui fait plus que l'affaire me concernant.

    Merci SpaceFrog !!!

  5. #5
    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
    Sinon pour éviter que la pattern ne s'étende sur plusieurs blocs, il suffit de rendre le quantificateur non-gourmand en lui adjoignant un point d'interrogation:* => *?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var pattern = /^DEBUT_POST\r?\n((?:.*\n)*?)FIN_POST$/gm;
    Le défaut intrinsèque des quantificateurs non-gourmands est qu'ils doivent tester la suite de la pattern (pour voir si elle réussit ou non) avant de consommer un caractère, ce qui peut devenir lourd s'il faut le faire pour chaque caractère, mais en l'appliquant à un groupe décrivant une ligne entière ((?:.*\n)), cet effet reste alors confiné aux débuts de ligne aboutissant ainsi à une pattern efficace. Ajouter des identifiants aux bornes devient alors inutile car la pattern s'arrêtera au premier FIN_POST trouvé.

    NB: le modificateur u n'existe pas en Javascript.
    Pour ce qui est des échappements:
    • il n'y a que douze caractères spéciaux à échapper, hors classes de caractères, dans le corps de la pattern, que sont: ( ) { [ | . ? * + \ ^ $.
    • il faut aussi échapper le délimiteur de pattern / si la pattern est exprimée de manière littérale (donc pas la peine quand on utilise le constructeur de RegExp avec une chaîne en paramètre, par contre dans ce cas il faut doubler tous les échappements).
    • le signe - dans une classe de caractère (sauf s'il est placé au début ou à la fin) doit être échappé car celui-ci sert à définir un intervalle de caractères (comme [a-z]).
    • le caractère ^ doit être échappé dans une classe de caractère s'il se trouve en première position, sans quoi il exprimera la négation de la classe.
    • le caractère ] doit être échappé dans une classe de caractère sans quoi il signale la fin de la classe.
    • le caractère \ doit être échappé même dans une classe de caractère pour figurer l'antislash.
    • le caractère { n'a pas besoin d'être échappé lorsqu'il ne présente pas d'ambiguïté avec le quantificateur {m,n}.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Membre régulier Avatar de devEric69
    Homme Profil pro
    Dév. Lazarus & C++, Php - Windows & Ubuntu
    Inscrit en
    Novembre 2012
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Dév. Lazarus & C++, Php - Windows & Ubuntu
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 74
    Points : 121
    Points
    121
    Par défaut
    Pour information, j'ai comparé la vitesse d'extraction des 2 regex (fonctionnant toutes les deux) sur https://regex101.com/:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DEBUT_POST\r?\n((?:.*\n)*?)FIN_POST  //<= 8 ms
    DEBUT_POST((?:.*\r?\n)*?)FIN_POST  //<= 2 ms
    Effectivement, la seconde est 4 fois plus rapide .

  7. #7
    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
    Citation Envoyé par CosmoKnacki Voir le message
    NB: le modificateur u n'existe pas en Javascript.
    Au temps pour moi, le modificateur u a été ajouté en Javascript avec ECMAScript 6, mais à ce jour, son support sur les navigateurs autres que Chrome >= 50, Firefox >=46 et Chrome for android >= 46 n'est pas garanti selon mdn.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. RegEx pour extraire les liens d'une page html
    Par herch dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 13/05/2009, 17h26
  2. Réponses: 1
    Dernier message: 19/08/2008, 21h13
  3. [RegEx] Regex pour extraire des noeuds XML
    Par lagotonio dans le forum Langage
    Réponses: 6
    Dernier message: 18/04/2008, 14h52
  4. Regex pour extraire un lien entre crochets
    Par elwario91 dans le forum Bibliothèque standard
    Réponses: 1
    Dernier message: 26/03/2008, 11h34
  5. [RegEx] Inverser REGEX pour extraire date
    Par MagicManu dans le forum Langage
    Réponses: 2
    Dernier message: 20/12/2007, 14h05

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