|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||
|
Invité de passage
![]() Inscription : juin 2007 Messages : 7 ![]() |
Bonjour.
Je suis en train de créer un parseur de BBCode avec des balises imbriquées. J'ai vu dans la documentation PHP pour la fonction preg_replace_callback une regex particulière qui permet de gérer l'imbrication.Ccependant j'ai du mal à l'adapter pour une utilisation légèrement plus complexe. Citation:
Je ne maîtrise pas cette recherche récursive et j'ai un problème car je veux parser une balise BBCode avec un argument (par exemple je veux capturer aussi bien[indent=10] que[indent]), et en laissant la même regex il me capture seulement les tags sans argument. Merci de m'éclairer. |
|||
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() Étudiant Inscription : août 2005 Messages : 632 ![]() |
[indent(?:=\d+)?]
te capture[indent=10] mais aussi[indent] Et merci pour le ?R je ne connaissait pas. |
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : juin 2007 Messages : 7 ![]() |
Justement non, j'avais essayé et ça ne marche pas, l'imbrication n'est plus supportée.
En gros je veux faire une balise pour créer un tableau. J'ai besoin de pouvoir y ajouter un style éventuellement, pour cela je dois aussi bien capturer [table]...[/table] que [table style="margin:auto;"]...[/table] par exemple... Voilà ma regex telle qu'elle est maintenant, je précise qu'elle ne supporte pas l'imbrication quand je met l'argument style mais qu'elle supporte l'imbrication lorsque je met simplement [table]...[/table] (elle capture mais pas de façon récursive en fait). Code :
Merci d'avance. |
||
|
|
00
|
|
|
#4 | ||||
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Je viens d'essayer :
Code :
Code :
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
||||
|
|
00
|
|
|
#5 | ||||||
|
Invité de passage
![]() Inscription : juin 2007 Messages : 7 ![]() |
En fait j'utilise une preg_split pour décomposer un texte en séparant les tableaux et le texte entre les tableaux.
La regex que j'avais, à savoir Code :
Citation:
J'ai mis cette regex Code :
Citation:
Merci à ceux qui me liront. |
||||||
|
|
00
|
|
|
#6 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Ta regex est trop complexe
Tel que je te l'ai proposé ci-dessus, ceci : Peut être abrégé en : Bon, c'est pas exactement ça mais l'idée est là : ta regex est trop complexe. Tu gagnerais beaucoup à utiliser des classes négatives [^...] plutôt qu'énumératives [azdv;,è_çà876], et en plus c'est + flexible. Par exemple entre des guillemets, le seul caractère interdit est... Le guillemet C'est plus simple de dire "tout sauf un guillemet" que d'énumérer toutes les solutions possibles.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : juin 2007 Messages : 7 ![]() |
Bon à ce niveau je suis d'accord avec ta remarque, bien que je me sois embêté à lister tous les caractères autorisés pour des raisons de sécurité (pour éviter le plus possible du css invalide et aussi du javascript).
Mais cette remarque ne règle en aucun cas mon problème, elle permet d'optimiser le fonctionnement de la regex certes, mais le problème reste inchangé. Ce qui ne fonctionne plus en revanche lorsque je rajoute un argument optionnel c'est la récursivité et là je ne sais plus comment faire, je n'arrive pas à comprendre comment fonctionne ?R et surtout pourquoi il se trouve dans un "ou" (| en regex). Merci. |
|
|
00
|
|
|
#8 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
C'est que... La récursivité pour un preg_replace, je ne sais pas si c'est possible
![]() As-tu essayé d'adapter le code que j'ai proposé ci-dessus ? Il fonctionne avec match, l'as-tu essayé avec replace ? J'ai peu que cela donne des résultats complètement erratiques. Je pense que dans ton cas, il est plus intéressant de définir une fonction récursive perso, utilisant preg_match (appel récursif à ta fonction perso) et str_replace (gain de perfs).
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : juin 2007 Messages : 7 ![]() |
C'est preg_split que j'utilise et pas preg_replace.
J'ai réussi à régler le problème, j'avais fait une énorme étourderie dans la condition pour rappeler la fonction récursivement, je faisais un strpos('[table'],..), c'est donc normal que ça ne fonctionnait pas. Merci quand même pour l'aide. |
|
|
00
|
|
|
#10 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Euh oui
Peux-tu proposer ici la solution finale ? J'aimerais le mettre dans la FAQ.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : juin 2007 Messages : 7 ![]() |
D'accord j'enverrai ma fonction.
Il y en a en tout pour une bonne cinquantaine de lignes, elle est presque terminée mais il me reste encore quelques détails à régler (je dois la combiner avec un htmlentities). Dès qu'elle est finie et testé je vous la donne, c'est promis |
|
|
00
|
|
|
#12 | ||||
|
Invité de passage
![]() Inscription : juin 2007 Messages : 7 ![]() |
Bonjour, me revoilà avec la balise tableau qui supporte l'imbrication.
Comme vous me l'avez demandé, je publie le code source de mes fonctions récursives. J'ai essayé de bien les commenter pour qu'elles soient plus compréhensibles mais j'avoue que ça reste très complexe. Voici les fonctions (je les ai élaborées dans le cadre du développement du CMS PHPBoost). Code :
Code :
[table] ou [table style="css du tableau'] Ensuite [row] Puis [col] ou [head] (pour les td ou th) avec comme arguments optionnels (il faut respecter l'ordre) rowspan="entier" colspan="entier" style="css de la cellule", par exemple [col rowspan="2" colspan="5" style="text-align:center;"]. Et puis ensuite on referme comme en html ([/col][/row][/table]). Il y a aussi la fonction pour repasser du html au BBCode, si certains sont intéressés qu'ils me fassent signe ! |
||||
|
|
00
|
|
|
#13 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Ok, merci bien !
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com