8792 sujets

Développement web côté serveur, CMS

Bonsoir tout le monde
je disposais d'un vieux script censé parser une chaine afin d'en convertir certaines parties, en clair, un script dérivé du bbcode
débutant en expressions régulières, j'avais juste copié les fonctions du style
$bbcode=preg_replace('!\[b\](.+)\[/b\]!isU','<strong>$1</strong>',$bbcode);

seulement voilà, voulant offrir des services un peu plus élaborés, j'ai commencé à modifier la fonction, la fonction de cette fonction est de "désactiver" bbcode entre deux balises..explications :
en début de script je transforme les crochets ouvrants [ qui se trouvent entre les balises Smiley bbcode [/bbcode] en balise <, le reste du script remplace les balises bbcode et je remet les crochets ouvrants ce qui fait que les balises bbcode seront affichées en clair..
seulement voilà la fonction telle que je l'ai modifiée ne fait pas exactement ce que je souhaite Smiley rolleyes
$bbcode=preg_replace('!\[bbcode\](.+)(\[)+(.+)\[/bbcode\]!isU','$1&lt;$3',$bbcode);

quand j'execute ça, il ne me converti qu'un seul crochet, comment faire pour qu'il convertisse tous les crochets situés entre les balises Smiley bbcode [/bbcode]??
je suis sous php5
merci d'avance pour toute aide
Modifié par CesarX (01 Feb 2007 - 21:01)
Bonjour,
Je te rappelle au passage que ce salon s'appelle "Standards web et langages serveur" et non pas simplement "langages serveur".

Cela étant dit, je pense que la solution à ton problème passe par l'utilisation de preg_replace_callback avec une mini-fonction anonyme.

Exemple :

$chaine = preg_replace_callback("#\\[nobbcode\\](.*?)\\[/nobbcode\\]#si", 
create_function('$match', '
return "[nobbcode]".str_replace("[", "&#91;", $match[1])."[/nobbcode]";
'), $chaine);

Il y a sûrement plus économe, mais je ne saurais pas faire mieux personnellement.

Au passage, il n'est pas très malin d'utiliser le point d'exclamation comme délimiteur, car ce caractère peut avoir une signification spéciale dans certains cas (cf. expreg.com)
oki c'est super comme ça!
merci d'avoir prit le temps de me répondre
voici le code qui fonctionne dans mon script :
$code=preg_replace_callback("#\\[code\\](.+)\\[/code\\]#isU",create_function('$match','return str_replace("[","&#91;",$match[1]);'),$code);

encore merci et bonne soirée
Modifié par CesarX (31 Jan 2007 - 23:58)