Bonjour à tous !

Suite à la création d'un module de BBCode, je voulais permettre une prévisualisation avant envoi, donc en JS. J'aurais aimé éviter une requête Ajax pour faire passer le tout dans du PHP, donc au final, il me faut décoder mon BBCode en full JS... C'est là le soucis.

Déjà, contrairement à preg_replace en PHP, le string.replace de JavaScript ne "boucle" pas. Ça explique les quelques problèmes que je vais énoncer là.. Voilà l'topo :

Il y a deux style de balise BBCode qui me préoccupent actuellement. Le reste sera adaptable si j'arrive à regler ces deux problèmes. Le premier :

balise de type (bold -> gras).
Admettons la chaine suivante dans un textarea :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[ B ]Hello [ B ]World[/B][/B]
Deux idées pour remplacer mes par des en JS :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
str = str.replace(/\[B\](.*)\[\/B\]/gi, '<b>$1</b>');
Résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<b>Hello [ b ]World[/b]</b>
Ceux autour du mot "World" ne sont pas pris en compte.

Autre idée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
str = str.replace(/\[B\](([^[](?!\B]))*)\[\/B\]/gi, '<b>$1</b>');
Résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[ b ]Hello <b>World</b>[/b]
Soit l'inverse de précédemment, mais ça ne va toujours pas...

Donc, si quelqu'un sait comment résoudre ce problème déjà

Le second problème est un chouilla plus complexe.
J'ai, dans mes BBCodes, la possibilité d'ajouter la balise :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[code lang=php][/ code]
Côté décodage, cette balise sera en gros, remplacé par une balise PRE.
L'inconvénient (ou l'avantage au choix) de cette balise PRE, c'est que les \n correspondent à des sauts de ligne, mais que les BR sont affichés tels quels.
Partout ailleurs, les \n provenant du textarea doivent être remplacé par des BR.

Donc le code ci-dessous :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
str = str.replace(/\n/g, '<br />');
va bien me remplacer mes \n par des BR dans mon texte, mais aussi entre mes balises "code lang=php".
J'aurai aimé éviter des remplacements du type "dans les balises code, je remplace tous les \n par une chaine de folie, idem pour les br, je remplace les \n partout dans la page, et je remet mes \n et mes br que j'avais modifiés dans les balises codes".
Le but est de trouver LA regexp qui fera :
"Remplacer tous les \n par des <br />, SAUF ceux entre les balises codes".

Pour info, voilà comment la balise code est remplacé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
str = str.replace(/\[code lang=([a-zA-Z0-9]+)\](.*?)\[\/code\]/gi, '<div class="code"><pre class="brush: $1">$2</pre></div>');
Et voilà, mes deux soucis sont exposés, et je sèche... Merci à SpaceFrog qui y a mis du sien, mais je suis toujours bloqué

Si quelqu'un qui passe par là à une idée Je n'saurais plus comment le remercier si sa réponse fonctionne ^^