Page 1 sur 1

preg_replace une fonction éxisterait-elle ?

Posté : 04 avr. 2007, 15:25
par katagoto
Bonjour a tous et toutes,
Voilà je suis entrain de réaliser un PregCode (assimillabe a un "BBCode"), comme les expression rationnel (preg_repalce) sont assez compliqué et possède de nombreuses fonctions, je me demandais si une fonction ne me permetterais pas de récupéré une valeur du patern exemple :
preg_replace('#\[[0369FC]{6}\](.+)\[/$1\]#isU', '<$1>$2</$1>', $t8);
______________cette valeur_______récupéré
______________serait $1 et________ici et semblable
______________récupérable________pour que le
______________dans les____________remplacement
______________qualificateurs_______soit effectif

esce-qu'une telle fonction éxisterait-elle ???
d'avance merci

PS : Je sais j'aurais pût faire comme tout le monde ([color=[0369FC]{6}\](.+)[/color]), mais j'ai pas envis ;)

Posté : 04 avr. 2007, 15:35
par naholyr
De mémoire ce que tu veux faire s'appelle un masque arrière. C'est-à-dire un masque basé sur ce qu'il a capturé un peu avant. Pour que ça marche il faut déjà... capturer :)

Il ne te manquait que ça : mettre des parenthèses autour de [0369CF] pour le capturer.
Au passage je ne sais plus si le "$1" marche dans les masques arrières, il faut peut-être revenir au "\1". Teste avec $1, et si ça ne marche pas essaie avec \1.

Par contre je me permets de te dire que ton remplacement est à peu près inutile, puisqu'au final il va remplacer par exemple

Code : Tout sélectionner

[ffffff]texte blanc[/ffffff]
par

Code : Tout sélectionner

<ffffff>texte blanc</ffffff>
Un str_replace(array('[',']'), array('<','>'), $chaine) aurait suffit :lol: C'est ça l'avantage du HTML ou du BBCode : on ouvre un type de balise (ici "color"), qu'on peut éventuellement spécifier (ici en ajoutant la couleur), et à la fin on ferme le type de balise, sans avoir à mémoriser la spécificité. Si je veux changer ma couleur je n'ai qu'à changer l'attribut dans la balise ouvrante.
Ton choix a ici un double inconvénient : à l'écriture (obligé de me souvenir de la couleur que j'ai ouverte pour pouvoir la fermer), et à la modification (si je change ma couleur, je dois changer la balise ouvrante ET fermante).

Posté : 04 avr. 2007, 15:47
par Expreg
$1 ne marchera pas !
Une référence arrière à l'intérieur d'un masque demande toujours l'appel sous la forme \1 :wink:

P'têt même que j'aurais utilisé [[:xdigit:]] pour la classe color :wink:

Mais c'est vrai, comme le souligne Naholyr qu'il faut se rappeler de la couleur du départ pour que ça marche.
De plus, il est a noter qu'une référence arrière (capture) ralenti la regex.
Sur cette seule regex c'est pas grave, mais je sens l'artillerie lourde derrière. :lol:

Posté : 04 avr. 2007, 16:15
par katagoto
merci a vous deux, j'en ai tennu compte, ça fonctionne bien et je fermerais par [/couleur], vite fais et bien fais ;)