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
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"
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)
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
(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...)
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.