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 :

Problème de parenthèses capturantes [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de Tuttu
    Homme Profil pro
    Inactif
    Inscrit en
    Février 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : Février 2007
    Messages : 135
    Points : 123
    Points
    123
    Par défaut Problème de parenthèses capturantes
    Bonjour à tous !

    Ca fait maintenant une journée que je me prends la tête avec une Regex que je n'arrive pas à faire fonctionner. Je m'en remets donc à vous !

    Le but est simple. Je suis en train de faire un parser XML basé sur les expressions régulières. Certains me diront peut-être que ce n'est pas la meilleure solution mais là n'est pas la question.

    Le bout de code qui me pose problème se présente comme ceci :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <Script ScriptName="throughput_SDSL_2_acces_10" Protocol="RTP" ServiceQuality="" VoIPCodec="" />

    Dans cette chaîne de caractère, plusieurs problèmes se présentent :
    • Les attributs "Protocol", ServiceQuality" et "VoIPCodec" peuvent être vides;
    • Ces mêmes attributs peuvent ne pas être présents.

    C'est ça qui me pose problème !
    Pour le moment, ma Regex se présente me ça :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    preg_match_all("#<Script ScriptName=\"([a-zA-Z0-9_.]+)\" (Protocol=\"([A-Z]*)\")? (ServiceQuality=\"(.*)\")? (VoIpCodec=\"(.*)\")? />#sU", $Pair[0][$j], $Script)
    ?>

    Basons nous sur l'attribut Protocol pour expliquer mon problème (les deux suivants étant gérés de la même façon)
    Comme vous pouvez le voir, dans un premier temps je recherche ce qu'il se trouve entre ScriptName=" et ". Jusque là, pas de problèmes.
    Viens ensuite la recherche de Protocol. Il faut à la fois que j'identifie ce qu'il se trouve entre Protocol=" et " et que je précise que l'ensemble peut ne pas exister. J'ai donc deux paires de parenthèses capturantes. La première vérifie si l'ensemble existe (grâce à (Mon_contenu)?) et la seconde regarde s'il y a du texte dans l'attribut (grâce à ([A-Z]*)).
    La Regex match bien, elle trouve ce que je veux, à une seule condition : il faut que tous les attributs soient présents ! S'il en manque un comme ceci par exemple (j'ai enlevé le VoIpCodec):
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <Script ScriptName="throughput_SDSL_2_acces_10" Protocol="RTP" ServiceQuality="" />
    J'aurais le droit à une belle erreur. Je ne match pas.
    Le ? qui englobe un attribut ne semble donc pas fonctionner.
    Je me demande donc ce que je peux faire pour réussir à obtenir le résultat que je souhaite !

    PS : Merci aux courageux qui sont allés jusqu'au bout !

  2. #2
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Le ? qui englobe un attribut ne semble donc pas fonctionner.
    Dans ton exemple tu ne l'as pas mi pour "VoIpCodec" :

    (VoIpCodec=\"(.*)\")

  3. #3
    Membre régulier Avatar de Tuttu
    Homme Profil pro
    Inactif
    Inscrit en
    Février 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : Février 2007
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    Exact, c'est un oubli que je viens de corriger. Il n'était pas présent dans le code que j'utilise, je l'avais oublié en écrivant le post donc cela ne change rien à mon problème.

    Merci tout de même pour l'info.

  4. #4
    Membre régulier Avatar de Tuttu
    Homme Profil pro
    Inactif
    Inscrit en
    Février 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : Février 2007
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    Le problème venait de la gestion des espaces entre chaque attribut.
    En effet, si un attribut est manquant, je me retrouvais à chercher deux (ou plus) espaces à la suite chose qui n'arrive jamais.
    En utilisant \s? pour chercher les espaces, le soucis est réglé.

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

Discussions similaires

  1. Appliquer regex avec parenthèse capturantes sur SELECT
    Par vallica dans le forum Requêtes
    Réponses: 3
    Dernier message: 01/02/2008, 12h34
  2. [ANTLR] Problème de parenthèses imbriquées
    Par vkphoenixfr dans le forum Autres langages
    Réponses: 0
    Dernier message: 30/11/2007, 11h40
  3. [TP] Problème de parenthèse
    Par AjeAurel dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 13/11/2007, 21h55
  4. [RegEx] ereg_replace et parenthèses capturantes
    Par liberty74 dans le forum Langage
    Réponses: 2
    Dernier message: 25/07/2007, 14h44
  5. Problème de parenthèse
    Par kj_83 dans le forum C++Builder
    Réponses: 14
    Dernier message: 08/07/2006, 17h31

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