Ptit prob d'expression régulière - PHP - Programmation
Marsh Posté le 15-04-2005 à 17:28:00
salut
voila une idée, pourquoi ne pas faire 2 preg_replace.
un pour transformer les occurences de [ g ] par <b> et l'autre pour celles de [ /g ] en </b>?
ca t'oblige a faire 2 traitement sur ton texte mais tu traitera toutes les occurences de chaque cas.enfin je pense...
Marsh Posté le 15-04-2005 à 17:55:28
La solution est simple: rajoute l'option U a la fin de ta regex. En francais on appel ca machin chose gourmand je sais po koi lol (Désolé mais la théorie tres peu pour moi...)
Donc:
Code :
|
Marsh Posté le 16-04-2005 à 02:34:59
En effet, ça marche, merci bcps
Suis plutôt étonné, j'ai jms entendu parler de cette option, et je viens d'éplucher un peu le net, je trouve même pas de doc dessus !
Sinon, pour les intéressés, un pote m'a donné une autre solution :
preg_replace("^\[g\](.*)?\[/g\]^U", "<b>$1</b>", $texte); |
L'ajout d'un ? entre les 2 balises permet aussi curieusement d'obtenir le même résultat.
Cependant, j'ai des choses plus compliqué, que cette méthode ne résoud pas pour autant :
preg_replace("^\[url\](.*)\|(.*)\[/url\]", "<a target='_blank' href='$1'>$2</a>", $texte); |
Bref, l'option ^U semble tout régler, c'est bon à savoir.
Marsh Posté le 16-04-2005 à 02:42:20
En effet, apparemment c'est juste une histoire de gourmandise !
Par défaut, l'expression matchée sera la plus grande possible (greedy mode), et le tout est de demander un matching non gourmand.
Par contre, PHP offre cette option U, mais pas perl par exemple.
Sur cette page : http://oopweb.com/Perl/Documents/P [...] reedy.html
est indiqué comment faire ça de façon "générique".
Donc au final lal, voilà à mon avis le replace à faire :
preg_replace("^\[g\](.*?)\[\/g\]^", "<b>$1<\/b>", $texte);
Et ouais, fallait juste ajouter un point d'interrogation ;(
++ lalilol
NB: Post posté maintenant au lieu de cet aprem, à cause de la validation du compte...
Marsh Posté le 16-04-2005 à 02:43:23
Par defaut les expressions regulieres permettent d'obtenir la plus longue chaine possible ki correspond au masque de recherche.
Peut etre que l'option U (jamais vu ca egalement ) permet le comportement inverse ^^
edit : doublé par pandov ^-^
Marsh Posté le 16-04-2005 à 02:55:07
hehe de justesse
Mais l'important c'est de participer hein
Marsh Posté le 16-04-2005 à 02:57:38
hum, ben en fait si, les '?' dans la regexp pour les url marchent aussi.
Donc
preg_replace("^\[url\](.*?)\|(.*?)\[/url\]", "<a target='_blank' href='$1'>$2</a>", $texte); |
revient à
preg_replace("^\[url\](.*)\|(.*)\[/url\]^U", "<a target='_blank' href='$1'>$2</a>", $texte); |
Marsh Posté le 15-04-2005 à 16:52:51
Bon, je viens chercher la solution de facilité.
Voilà 2h que j'essaie de résoudre un bug qui m'a semblé à 1ère vue facile, mais qui résiste !
Explications :
Je souhaite transformer :
[g]Bonjour[g]
en :
<b>Bonjour</b>
D'où la regexp suivante :
preg_replace("^\[g\](.*)\[/g\]^", "<b>$1</b>", $texte);
Ca marche parfaitement, sauf si 2 ou plus séquences [ g ][ /g ] (sans les espaces) sont sur la même ligne. Exemple :
[g]Bonjour[/g] blabla [g]Salut[/g]
donne ceci :
<b>Bonjour[/g] blabla [g]Salut</b>
Evidemment, j'ai bien compris ce qu'il se passait, il s'arrête à la dernière balise trouvée, et enregistre tout ce qu'il y a au milieu dans $1.
Mais, j'ai beau éplucher les docs, je ne trouve pas de solutions.
Une idée ?
Message édité par lalex le 15-04-2005 à 16:55:57