Voila j'ai un petit problème. Je fais un formulaire de saisie avec BBCODE, tout fonctionne parfaitement. Sauf! (ben oui fallait bien que y'ait un petit problème) au niveau de la couleur. Si mon utilisateur tape ca :
[couleur valeur="deeppink"][couleur valeur="crimson"]fafa[/couleur][/couleur]
C'est sur qu'en principe on fait pas une couleur au dessus d'une autre c'est idiot, mais j'aimerai bien quand même pour l'utilisateur (c'est un truc en entreprise) que ça lui évite des erreurs de ce genre. Voila le code :
function preview()
{
var field = document.getElementById("contenu_area").value;
field = field.replace(/\[b\]([\s\S]*?)\[\/b\]/g, '<b>$1</b>');
field = field.replace(/\[i\]([\s\S]*?)\[\/i\]/g, '<i>$1</i>');
field = field.replace(/\[u\]([\s\S]*?)\[\/u\]/g, '<u>$1</u>');
field = field.replace(/\[centre\]([\s\S]*?)\[\/centre\]/g, '<center>$1</center>');
field = field.replace(/\[lien url=([\s\S]*?)\]([\s\S]*?)\[\/lien\]/g, '<a href=$1">$2</a>');
field = field.replace(/\[img url=([\s\S]*?)\]\[\/img\]/g,'<img src=$1 alt="erreur_image"/>');
field = field.replace(/\[taille valeur=\"tgrand\"\]([\s\S]*?)\[\/taille\]/g,'<h2>$1</h2>');
field = field.replace(/\[taille valeur=\"grand\"\]([\s\S]*?)\[\/taille\]/g,'<h3>$1</h3>');
field = field.replace(/\[taille valeur=\"normal\"\]([\s\S]*?)\[\/taille\]/g,'<h4>$1</h4>');
field = field.replace(/\[taille valeur=\"petit\"\]([\s\S]*?)\[\/taille\]/g,'<h5>$1</h5>');
field = field.replace(/\[taille valeur=\"tpetit\"\]([\s\S]*?)\[\/taille\]/g,'<h6>$1</h6>');
field = field.replace(/\[couleur valeur=\"([\s\S]*?)\"\]([\s\S]*?)\[\/couleur\]/g,'<font color="$1">$2</font>');
document.getElementById("previewDiv").innerHTML = field;
}
J'avais eu ce type d'erreur en php mais je l'avais résolu en mettant isU après le masque mais en javascript j pensais que /g était un équivalent.
Le is comme "options" de la régex servent à autre chose, le i évite que la régex soit casse-sensitive, et le s c'est pour les sauts de ligne (\n) je crois.
field = '[couleur valeur="deeppink"][couleur valeur="crimson"]fafa[/couleur][/couleur]';
field = field.replace(/\[couleur valeur="([^"]*)"\]([\s\S]*)?\[\/couleur\]/gi, '<font color="$1">$2</font>');
alert(field); //<font color="deeppink">[couleur valeur="crimson"]fafa[/couleur]</font>
J'ai seulement sorti le ? des parenthèses
Avec ça, tu obtiens le résultat que tu espères, seulement, cela ne marche qu'une fois =/
Il faudrait faire une récursion
Edit: Finalement j'ai fais ça:
// Tu ne déclares ça qu'une seule fois
String.prototype.recurReplace = function(regEx, str) {
var reg, maVar, content = this;
while(true) {
reg = regEx;
maVar = reg.exec(content);
if (maVar != null) {
content = content.replace(regEx, str);
}
else {
break;
}
}
return content;
}
//Ensuite tu peux t'en servir partout
var field = '[couleur valeur="deeppink"][couleur valeur="crimson"]fafa[/couleur][/couleur]';
field = field.recurReplace(/\[couleur valeur="([^"]*)"\]([\s\S]*)?\[\/couleur\]/i, '<font color="$1">$2</font>');
field = field.recurReplace(/\[taille valeur="([^"]*)"\]([\s\S]*)?\[\/taille\]/i, '<font size="$1">$2</font>');
// Et tu peux l'utiliser autant de fois que tu veux, sur les variables que tu veux
Apparemment ça marche, Mais je pense qu'il doit y avoir mieux
Regex imbriquée
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.