Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/04/2008, 06h33   #1
Nouveau Membre du Club
 
Erick
Inscription : décembre 2007
Messages : 81
Détails du profil
Informations personnelles :
Nom : Erick
Âge : 27
Localisation : Canada

Informations forums :
Inscription : décembre 2007
Messages : 81
Points : 32
Points : 32
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 :
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 :
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à :/
}
Chasseur d'étoiles est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 11h28   #2
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
ajoute l'option U a ta regexp... c'est magique.

Code :
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 :
1
2
$regexp='#<Fx:PlaceHolder ID="([^"]+)">(.+)</Fx:PlaceHolder>#U';
preg_match_all($regexp,....);
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 14h34   #3
Nouveau Membre du Club
 
Erick
Inscription : décembre 2007
Messages : 81
Détails du profil
Informations personnelles :
Nom : Erick
Âge : 27
Localisation : Canada

Informations forums :
Inscription : décembre 2007
Messages : 81
Points : 32
Points : 32
Hoï ! voila qui est très utile comme information.

Néanmoins ....

Citation:
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 ?
Chasseur d'étoiles est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 14h44   #4
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
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.
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h35.


 
 
 
 
Partenaires

Hébergement Web