Ptit prob d'expression régulière

Ptit prob d'expression régulière - PHP - Programmation

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
Reply

Marsh Posté le 15-04-2005 à 16:52:51   

Reply

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...


Message édité par jojo_lafrite le 15-04-2005 à 17:31:17
Reply

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 :
  1. preg_replace("^\[g\](.*)\[/g\]^U", "<b>$1</b>", $texte);

Reply

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. :)
 
 :hello:  

Reply

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...

Reply

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 :p) permet le comportement inverse ^^
 
edit : doublé par pandov ^-^


Message édité par afbilou le 16-04-2005 à 02:45:29
Reply

Marsh Posté le 16-04-2005 à 02:55:07    

hehe de justesse :)
Mais l'important c'est de participer hein :kaola:

Reply

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);


 
 :pt1cable:

Reply

Marsh Posté le 16-04-2005 à 03:00:49    

Tout est bien qui finit bien, bown nuit :sleep:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed