REMPLACER UN MOT DANS UNE CHAINE

Signaler
Messages postés
81
Date d'inscription
jeudi 19 février 2004
Statut
Membre
Dernière intervention
18 avril 2008
-
jdmcreator
Messages postés
647
Date d'inscription
samedi 30 décembre 2000
Statut
Membre
Dernière intervention
20 juillet 2012
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44974-remplacer-un-mot-dans-une-chaine

jdmcreator
Messages postés
647
Date d'inscription
samedi 30 décembre 2000
Statut
Membre
Dernière intervention
20 juillet 2012
5
Bonjour,

Je suis d'accord avec la solution proposé par l'auteur de cette source. Utiliser des RegExp à la volée, générés automatiquement lors d'une opération est beaucoup trop dangereux. Prenons par exemple:

function RC(str,quoi,par){
return str.replace(new RegExp(quoi,'gi'),par);
}

Si on veux remplacer tous les points (.) par des points d'interrogation (?), cela ne marchera pas car le point (.) signifie en RegExp n'importe quel caractère. Faire un traitement de tout cela serait beaucoup trop long et resterait tout de même dangereux. J'ai toutefois modifié la source que je posterai dans un long document contenant une centaine d'astuce et petits codes comme celui-ci en lui apportant le prototype avec String (String.change) mais surtout un troisième paramètre qui est le deuxième `paramètre des RegExp (g, i, gi, "") et en lui faisant adopter le même comportement. Donc, la fonction peut remplacer un mot sans accorder d'importance à la CaSe. Finalement, cette fonction retourne un objet qui a 2 propriétés :

data : la chaîne remplacée

results : un Array contenant toutes les occurences trouvées.

Voici donc, la fonction avec un exemple et une version compressée :

<script type="text/javascript">
String.prototype.change = function (quoi, par, gi) {
chaine = this; gi ((gi "ig") ? "gi" : gi) || "";
i = 0;
k = 0;
r = "";
g = [];
q = "";
match = false;
while (i < chaine.length) {
c = chaine.charAt(i);
tn = (gi.indexOf('i') != -1) ? c.toLowerCase() : c;
ty = (quoi.charAt(k).indexOf('i') != -1) ? quoi.charAt(k).toLowerCase() : quoi.charAt(k);
if (tn == ty) {
match = true;
k++;
} else {
if (match == true) {
for (z = i - k; z < i; z++) {
r = r + chaine.charAt(z);
}
}
match = false;
k = 0;
}
if (match == false) {
r = r + c;
i++;
} else {
if (k == quoi.length) {
for (z = i - k; z < i; z++) {
q += chaine.charAt(z + 1);
}
g.push(q);
q = "";
r = r + par;
match = false;
k = 0;
if (gi.indexOf('g') == -1) {
r += chaine.substring(i + 1, chaine.length);
break;
}
}
i++;
}
}
return {
data: r,
results: g
}
}
/*Version compressée
String.prototype.change=function(quoi,par,gi){chaine=this;gi=((gi=="ig")?"gi":gi)||"";i=0;k=0;r="";g=[];q="";match=false;while(i<chaine.length){c=chaine.charAt(i);tn=(gi.indexOf('i')!=-1)?c.toLowerCase():c;ty=(quoi.charAt(k).indexOf('i')!=-1)?quoi.charAt(k).toLowerCase():quoi.charAt(k);if(tn==ty){match=true;k++}else{if(match==true){for(z=i-k;z

Chaîne :<script type-"text/javascript">document.write("<textarea id=input1>Dans cette eXemple d'exemple comme exemple d'EXEMPLe, nous pouvons voir un eXeMpLE (oui ça ne fait pas de sens)<"+"/textarea>");</script>

Remplacer : par :

<select id=input4><option></option><option value="g">g</option><option value="i">i</option><option value="gi" selected>gi</option></select>

Démarrer
jdmcreator
Messages postés
647
Date d'inscription
samedi 30 décembre 2000
Statut
Membre
Dernière intervention
20 juillet 2012
5
Bonjour askil2000,

D'abord merci pour votre source. Seulement, j'aimerais bien voir s'il n'existerait des façons plus rapide et plus efficace. Celle proposé en haut ne fonctionne pas et celle d'Arto est beaucoup plus longue.
cs_askil2000
Messages postés
92
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
12 avril 2010

re

Conclusion, quand on a 2 008 pts sur CS et qu'on code en VB,
on peut se permettre de se prendre pour un dieu:

"Je te trouve bien arrogant pour quelqu'un qui poste un code si simple et si peu original..."

"Si ta fonction est "rapide et efficace", alors la mienne est... magique?? non..."

"Allez je me permet un troll... :)"

"Quelqu'un qui ne sait pas lire deux boucles imbriquées et 3 tests conditionnels, ce n'est pas un débutant, c'est un leecheur de code ^^"

- Et aussi d'estimer que tout le monde est au même niveau hein ?

"Parce que j'estime justement que cela ne mérite pas la création d'une nouvelle source pour si peu..."

- Mais ou l'intérêt de CS si on laisse le jugement des soi-disant dieux de la prog ?

- Ne voulant pas commencer une phrase par je, pour éviter toute suspicion devant les dieux, j'implore Sa Majesté
de bien vouloir m'excuser pour ce code déjà utilisé par un développeur de 57 ans(valneandre). Sur ceux, je ne vais faire de ce post un chat. LAST MESSAGE!

PS: hvb, tu devrais te prendre un peu moins au sérieux, sa t'éviterais d'avoir mal aux chevilles.
hvb
Messages postés
939
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
27 janvier 2009
1
Allez je me permet un troll... :)

"mais pour le coté pratique j'ai préféré utiliser les while, if et boolean."
Le... coté pratique?? Je ne vois pas ce qu'il y a de pratique à écrire un code plus long à l'execution (et à l'écriture) que sa première idée...

"Maintenant, je ne pense pas qu'un débutant puisse comprendre le code, ni même le modifier, c'est pour cette raison qu'il s'adresse aux initiés et non aux débutants"
Quelqu'un qui ne sait pas lire deux boucles imbriquées et 3 tests conditionnels, ce n'est pas un débutant, c'est un leecheur de code ^^

"Si mon code est si simple et si peu original, pourquoi ne trouve-t-on pas le tien sur ce site ?"
Parce que j'estime justement que cela ne merite pas la création d'une nouvelle source pour si peu...

"Oui, dans la vie il faut être sur de sois, sinon on n'arrive à rien."
Être sur de soi quand on a pas spécialement raison n'aide à rien, sauf à se décrédibiliser ;)