Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1848 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Ptit prob d'expression régulière

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Ptit prob d'expression régulière

n°1048887
lalex
Posté le 15-04-2005 à 16:52:51  profilanswer
 

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
mood
Publicité
Posté le 15-04-2005 à 16:52:51  profilanswer
 

n°1048936
jojo_lafri​te
tout est dans la frite
Posté le 15-04-2005 à 17:28:00  profilanswer
 

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
n°1048995
Tempus_Fug​it
tempinou
Posté le 15-04-2005 à 17:55:28  profilanswer
 

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

n°1049424
lalex
Posté le 16-04-2005 à 02:34:59  profilanswer
 

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:  

n°1049425
pandov
Posté le 16-04-2005 à 02:42:20  profilanswer
 

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

n°1049427
afbilou
pouet your life
Posté le 16-04-2005 à 02:43:23  profilanswer
 

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
n°1049430
pandov
Posté le 16-04-2005 à 02:55:07  profilanswer
 

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

n°1049431
lalex
Posté le 16-04-2005 à 02:57:38  profilanswer
 

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:

n°1049433
pandov
Posté le 16-04-2005 à 03:00:49  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Ptit prob d'expression régulière

 

Sujets relatifs
tjours prob avec fgetcsv .. + clairExpression reg : 01->Janvier 02->Fevrier
Prob. avec les maps quake3 .BSP[Caml] Conception de ptit jeux --> probleme!
prob avec fgetcsvProb de wchar_t avec Glut sous Dev cpp
[Javascript] + Expression ReguliereRegular Expression
expression reguliere avec code source 
Plus de sujets relatifs à : Ptit prob d'expression régulière


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR