Perle, tu m'ennuies avec tes expressions - PHP - Programmation
Marsh Posté le 05-01-2004 à 21:18:51
Le langage que tu veux parser releve de l'analyse syntaxique. Or les expressions regulières ne sont pas capable de faire ça proprement à moins de hacker des trucs crades qui marchent "la plupart du temps".
Il faut te tourner vers l'écriture d'un vrai parser
Marsh Posté le 05-01-2004 à 21:21:44
Et moi qui pensais que les expressions régulière pouvaient tout faire !!!
Marsh Posté le 05-01-2004 à 21:23:30
regex -> analyse lexicale et c'est déjà pas mal
Marsh Posté le 05-01-2004 à 21:29:11
y'a moyen avec preg_replace_callback.
tu fais un callback qui regarde si il reste encores des balises [structure]. Si oui, tu reviens sur ton preg_replace_callback, sinon tu arretes.
C'est un peu crade mais ca fonctionne plutot bien et rapidement
Marsh Posté le 05-01-2004 à 23:03:31
J'ai trouvé quelquechose d'intérressant dans la documentation PHP :
http://fr.php.net/manual/fr/pcre.pattern.syntax.php
tout en bas de la page à propos des ... masques récursifs
Exemple :
Code :
|
(option x pour ne pas prendre en compte les espaces pour la présentation ... quoique bof les tab)
cela retournera :
ae(a)ae((d))
donc c'est bien ce que tu veux, à part le problème que tu veux une balise avec un paramètre spécifique et que celle à l'intérieur n'ont pas forcemment le même paramètre.
J'ai essayé ceci ... mais cela impose qu'il n'y ai que des balises STRUCTURE mais bon je pense qu'on doit pouvoir s'arranger :
Code :
|
qui renvoie :
Code :
|
donc exactement ce que tu veux !!!!
bon explication : je récupère d'abord une chaîne de caractère telle qu'elle commence juste avant la première balise ayant pour paramètre $valeur (donc "toto" ). Ensuite j'applique l'expression régulière avec masque récursif (tel que expliqué dans le manuel ... À Lire et essayer !) et je n'ai pas besoin de me préoccuper de récupérer le contenu de la première balise avec le bon paramètre, vu que la chaîne commence maintenant avec la bonne balise. Et Hop Magie
Essaie avec d'autres chaînes au cas où mais ça devrait marcher "normalement" ... Sinon reste à voir pour qu'on puisse mettre d'autres balises que STRUCTURE (je vais dormir là )
Bye et bon courage
Marsh Posté le 06-01-2004 à 11:19:57
J'avais vu (?R) y'a pas longtemps. Le probleme est que, comme le masque imbriquée enregistré est uniquement le dernier, l'interet est plutot limité. Si il y avait un moyen pour enregistrer tous les masques imbriqués ou non, ca serait la tres interessant !
Marsh Posté le 06-01-2004 à 17:15:14
Merci Tentacle mais cela ne fonctionne pas parfaitement, en effet ton code ne traite pas correctement ma page:
http://www.canard.ch/template.html
Reprenons tout depuis le début... Je cherche à parser en php du code html contenant des balises du type:
[NomBalise=Valeur]
Contenu html...
[/NomBalise]
Prenons le code exemple suivant:
--------------------------------
Code :
|
Je souhaite obtenir un tableau contenant chaque contenu de structure sans les structure internes
Exemple:
--------
[main] => Contenu_1\nContenu_4
[sub1] => Contenu_2
[subSub1] => Contenu_3
[sub2] => Contenu_5
[sub3] => [TEXT=bonjour]
J'avais pensé traiter les choses récursivement avec des expressions régulières mais celles-ci ne sont pas capable de faire si compliqué...
Je pensais ensuite utiliser les expressions régulière simplement pour me trouver les balises mais à partir de cela tout ce corse....
Admettons que je puisse récupérer la position du pointeur après le début de la première balise j'imagine le code suivant:
Code :
|
Je trouve ce code très très très moche mais bon.. En plus il marche pas car je ne sais pas comment récupérer la position du pointeur après le tag trouvé...
Marsh Posté le 06-01-2004 à 17:54:28
question con: tu pourrais pas faire du XML, comme tout le monde?
Marsh Posté le 06-01-2004 à 17:59:44
gizmo a écrit : question con: tu pourrais pas faire du XML, comme tout le monde? |
Réponse bête: Non !!
Dans un éditeur html que la plulart des newbies utilisent: Dreamweaver, ou pire encore, front page, les balises xml sont invisibles...
deux avantages des balises carrées: Elle sont visible directement dans la preview du code et elle ne se confondent pas avec le code html...
Marsh Posté le 06-01-2004 à 22:04:33
Essaie cela :
Code :
|
Le résultat est dans $TagList;
Ya des trucs pas très beaux comme le fait de passer la string à l'appel et au retour de chaque fonction.
Enfin essaie voir si ça marche, et par contre voit si tu as besoin d'effacer tout les retours chariots et les tabulations qui apparaissent ...
Marsh Posté le 06-01-2004 à 22:14:15
C'est joli, bravo.. Merci..
Euh, je sais plus quoi dire...
Ca fonctionne à merveille...
Marsh Posté le 06-01-2004 à 22:22:31
Kalios a écrit : C'est joli, bravo.. Merci.. |
non sérieux, je sais vraiment plus quoi dire...
Marsh Posté le 06-01-2004 à 22:44:50
Kalios a écrit : |
j'ai un peu maché le travail ? mais ça remet dans le bain ! Content d'avoir pu être utile.
Marsh Posté le 05-01-2004 à 21:16:19
C'est pourtant pas compliqué mais ca marche pas...
Je souhaite rechercher tout ce qui est contenu entre la balise [STRUCTURE="valeur"] et la balise [\STRUCTURE].
Malheureusement ce qui ce trouve entre ces balises peut aussi être d'autres balises structure comme ceci:
[STRUCTURE="valeur1"]
[STRUCTURE="valeur2"]
blabla
[/STRUCTURE]
[/STRUCTURE]
[STRUCTURE="valeur2"]
blabla
[/STRUCTURE]
dans cet exemple je souhaite capturer:
[STRUCTURE="valeur1"]
[STRUCTURE="valeur2"]
blabla
[/STRUCTURE]
[/STRUCTURE]
Ceci montre que mon expression régulière ne fonctionne pas:
/\[STRUCTURE=\"?$structName\"?\]([\W\S]*)\[\/STRUCTURE\]/im
Avez-vous en vous le moyen de m'aider !!!
---------------
.:coin:.