Partage
  • Partager sur Facebook
  • Partager sur Twitter

Regex imbriquée

    10 avril 2009 à 11:09:38

    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]

    Ca lui affiche ça dans la prévisualisation :

    [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.
    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2009 à 12:41:14

      Je suis tombé sur ça http://blogs.frugalware.org/vmiklos/20 [...] in_javascript qui essaye d'imiter le comportement ungreedy des regex j'ai pas testé, mais a priori ça doit être une solution.

      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.
      • Partager sur Facebook
      • Partager sur Twitter
        10 avril 2009 à 13:56:14

        Euh, le paramètre U existe aussi en js non?

        J'ai parlé trop vite, désolé.

        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
        • Partager sur Facebook
        • Partager sur Twitter

        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.
        • Editeur
        • Markdown