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 :
[ B ]Hello [ B ]World[/B][/B]
Deux idées pour remplacer mes par des en JS :
str = str.replace(/\[B\](.*)\[\/B\]/gi, '<b>$1</b>');
Résultat :
<b>Hello [ b ]World[/b]</b>
Ceux autour du mot "World" ne sont pas pris en compte.
Autre idée :
str = str.replace(/\[B\](([^[](?!\B]))*)\[\/B\]/gi, '<b>$1</b>');
Résultat :
[ 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 :
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 :
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é :
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 ^^
Partager