Partage
  • Partager sur Facebook
  • Partager sur Twitter

Besoin de conseils d'optimisation

    25 juillet 2009 à 12:47:32

    Bonjour, pour mon script j'ai eu besoin d'utiliser la fonction split des chaînes de caractères avec une regex possédant des parenthèses capturantes :euh:
    Et le problème est que sur IE (ou peut-être d'autres navigateurs) on ne peut pas capturer d'éléments avec la fonctions split de "base".
    J'ai donc été obligé de créer ma propre fonction de split... Bon j'y suis arrivé, ça marche sur FF et IE le problème est que c'est bien plus lent que la fonction split de "base" o_O
    Donc je demande de l'aide pour pouvoir optimiser ma fonction :
    Voici son code :
    function splitRegex(str, regex)
    {
    	str += ""; // on cast la variable en chaîne de caractère
    	var retour = []; // cette variable va contenir le tableau à renvoyer
    	if (!regex.global) { // on vérifie si la regex n'a pas le paramètre global
    		// si ce n'est pas le cas on doit le rejouter
    		regex = new RegExp(regex.source, // ici on créer une regex à partir de celle passée en paramètre
    			((regex.ignoreCase) ? "i" : "") + // on ajoute les paramètres de la regex
    			((regex.multiline) ? "m" : "") +
    			((regex.sticky) ? "y" : "") + "g"); // et on rajoute le paramètre 'g' vu qu'il n'est pas présent
    	}
    	var reply = str.match(regex), bfr;
    	if(reply) { // si le motif a été trouvé dans la chaine
    		for(var i = 0; i < reply.length; i++) {
    			retour.push(str.slice(0, str.indexOf(reply[i]))); // on ajoute le chaine jusqu'à la position de la sous-chaine vérifiant le motif
    			bfr = regex.exec(reply[i]); // on récupère les éventuels éléments capturés
    			if(bfr && bfr.length > 1) { // si il y a des éléments
    				for(var f = 1; f < bfr.length; f++) {
    					retour.push(bfr[f]);
    				}
    			}				
    		} // jusqu'ici on a tous les éléments sauf le dernier...
    		var pos = reply[reply.length - 1]; // ici je crée une variable pour enlever un calcul
    		pos = str.indexOf(pos) + pos.length;
    		retour.push(str.substring(pos)); // on ajoute ce dernier élément
    	} else { // le motif n'a pas été trouvé, on renvoi donc la chaine dans un array...
    		retour = [str];
    	}		
    	return retour;
    }
    

    Merci d'avance de votre aide

    EDIT : en fait elle ne marche pas complètement cette fonction :'( (si on envoie plus de 3 éléments à séparer)
    • Partager sur Facebook
    • Partager sur Twitter
      25 juillet 2009 à 15:26:31

      Pour la transformation en chaîne, je ne suis pas sûr que ça soit une bonne idée.
      Il faudrait plutôt vérifier si c'en est une et faire un return si c'est le cas.
      Tu as de la chance, je vies de trouver la fonction pour savoir si une variable est une chaîne :) : http://www.siteduzero.com/forum-83-426 [...] isstring.html
      Pour les flags, je ne pense pas que ça soit une bonne idée d'y mettre sur plusieurs ligne (mais bon, ça c'est peut-être pas un problème) par contre, mettre des flag vides, je suis sûr que c'est pas une bonne idée :)

      Pour les boucles for(), il faut calculer le length dans l'initialisation :
      for(var i = 0, l=reply.length; i < l; i++) {
      

      idem l.18

      et pour : retour = [str];
      Ca redéclare la variable...
      Je pese que
      retour[0] = str;
      est mieux.(l.27)

      Pour le new Regex(), je pense que c'est comme entre new Array() et[], le deuxième est plus rapide...
      M'enfin je suis pas sûr et il y a les flag variables que tu ne pourrais pas mettre si tu faisais comme ça...
      Bref, à confirmer mais un if pourrait accélérer le script.
      Pour les flag, un truc avec apply() ou exec() pourrait peut-être t'aider... à éviter de mettre des params vides... mais c'est pas sûr... je sais pas si ces fonctions sont lentes ou pas...

      Au passage, dsl si je radote ou autre... mais je suis au futuroscope sous IE6 ( >_< ) et j'ai la flemme de me relire :p
      (Non, je ne suis pas geekeux au point de venir là quand je suis au futuroscope... mes poarents regardent un truc que j'ai déjà vu à la géode...)
      • Partager sur Facebook
      • Partager sur Twitter

      Besoin de conseils d'optimisation

      × 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