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 :

isolement d'éléments xml


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 87
    Points : 186
    Points
    186
    Par défaut isolement d'éléments xml
    Je suis présentement à l'élaboration d'un petit moteur de view qui vas se baser sur le principe des placeholder en asp. Problème par contre c'Est que j'arrive pas à isoler tous les éléments ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
     
    $string = "<Fx:PlaceHolder ID=\"machin\"><title 123></Fx:PlaceHolder>";
    $string .= "<Fx:PlaceHolder ID=\"marchin2\"><title 123></Fx:PlaceHolder>";
    $string .= "<Fx:PlaceHolder ID=\"marchin3\"><title 123></Fx:PlaceHolder>";
     
    preg_match_all('/((<Fx:PlaceHolder ID=")([a-zA-Z0-9_-]+)(">)(.+)(<\/Fx:PlaceHolder>)+)/', $string, $placeholders);
     
    var_dump($placeholders);
     
    ?>
    et le dump me donne ceci:

    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
     
    array(7) {
      [0]=>
      array(1) {
        [0]=>
        string(172) "<Fx:PlaceHolder ID="machin"><title 123></Fx:PlaceHolder><Fx:PlaceHolder ID="marchin2"><title 123></Fx:PlaceHolder><Fx:PlaceHolder ID="marchin3"><title 123></Fx:PlaceHolder>"
      }
      [1]=>
      array(1) {
        [0]=>
        string(172) "<Fx:PlaceHolder ID="machin"><title 123></Fx:PlaceHolder><Fx:PlaceHolder ID="marchin2"><title 123></Fx:PlaceHolder><Fx:PlaceHolder ID="marchin3"><title 123></Fx:PlaceHolder>"
      }
      [2]=>
      array(1) {
        [0]=>
        string(20) "<Fx:PlaceHolder ID=""
      }
      [3]=>
      array(1) {
        [0]=>
        string(6) "machin"
      }
      [4]=>
      array(1) {
        [0]=>
        string(2) "">"
      }
      [5]=>
      array(1) {
        [0]=>
        string(127) "<title 123></Fx:PlaceHolder><Fx:PlaceHolder ID="marchin2"><title 123></Fx:PlaceHolder><Fx:PlaceHolder ID="marchin3"><title 123>"
      }
      [6]=>
      array(1) {
        [0]=>
        string(17) "</Fx:PlaceHolder>"
      }
    Bref ici je cherche à avoir ce que contiens ID et ce qui se trouve à l'intérieur de <FxlaceHolder></FxlaceHolder> en considérant que ce qui s'y trouve peut être du html ou tout texte.

    J'avoue que je sèche un peu là :/
    }

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    ajoute l'option U a ta regexp... c'est magique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $regexp="#....#U";
    preg_match_all($regexp, ...);
    Petits détails :
    * utilise # au lieu de / comme debut/fin de regexp, ca evite d'avoir a echapper les /
    * utilise des apostrophes pour eviter d'echapper les quotes
    * Tu n'a pas besoin de capturer les chaines fixes
    * Pour l'ID tu peux utiliser plus simplement "tout les caracteres qui ne sont pas guillemets" avec ca : ([^"]+)
    * chercher a gérer la répétition du pattern global <Fx..></Fx...> avec le + final ne sert a rien puisque c'est géré par le "all" de preg_match_all

    Bon, au final ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $regexp='#<Fx:PlaceHolder ID="([^"]+)">(.+)</Fx:PlaceHolder>#U';
    preg_match_all($regexp,....);

  3. #3
    Membre habitué
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2007
    Messages : 87
    Points : 186
    Points
    186
    Par défaut
    Hoï ! voila qui est très utile comme information.

    Néanmoins ....

    U (PCRE_UNGREEDY) Cette option inverse la tendance à la gourmandise des expressions rationnelles. Vous pouvez aussi inverser cette tendance au coup par coup avec un ?. De même, si cette option est activée, le ? rendra gourmand une séquence. Cette option n'est pas compatible avec Perl. Elle peut aussi être mise dans le masque avec l'option ?U dans le pattern ou par un point d'interrogation avant le quantifieur (.e.g. .*?).
    dans un langage humainement compréhensible ... ça ressemble à quoi cette définition ?

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    En gros ca veux dire que l'expression reguliere va s'arreter dès qu'elle va trouver une correspondance pour le masque.

    Par exemple :

    preg_match('#a(.+)c#','abcddddddc') va sortir 'bcdddddd' parce que par defaut il essaye de faire en sorte que les masques satisfassent la plus grande chaine possible.

    preg_match('#a(.+)c#U','abcddddddc') va sortir 'b' parce qu'avec l'option U il essaye de faire en sorte que les masques satisfassent la plus petite chaine possible.

Discussions similaires

  1. [DOM] Inclure un élément XML au milieu d'une portion de texte
    Par Yogui dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 04/07/2007, 12h47
  2. Egalité d'éléments xml
    Par totoranky dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 16/10/2006, 16h20
  3. [AJAX] Isoler les éléments de "xhr.responseText" ?!
    Par ghohm dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/09/2006, 15h00
  4. [JDOM] Récupération du texte d'un élément XML‎
    Par kaninama dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 20/05/2006, 11h36
  5. Répétition des éléments XML
    Par Robinreg7 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 08/02/2006, 11h34

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