Remplacer un mot dans une chaine

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 175 fois - Téléchargée 17 fois

Contenu du snippet

Bonjour,

N'aimant pas travailler avec les expressions régulières sous javascript, voici une fonction parallèle qui remplace toute les occurences d'un mot dans une chaine.

Source / Exemple :


function RC(chaine, quoi, par)
{i=0;k=0;r="";match=false;
while(i<chaine.length){c=chaine.charAt(i);
if(c==quoi.charAt(k)){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){r=r+par;
match=false;k=0;}i++;}}return r;}

///////////////////////////
/* Exemple d'utilisation */

function smileys(chaine)
{
 chaine = RC(chaine, ":o)", "01")
 alert(chaine);
}

<input type="text" id="chaine">
<input type="button" value="test" onclick="smileys(document.getElementById('chaine').value);">

Conclusion :


Veuillez excuser mon codage un peu sec pour la fonction RC

A voir également

Ajouter un commentaire

Commentaires

jdmcreator
Messages postés
647
Date d'inscription
samedi 30 décembre 2000
Statut
Membre
Dernière intervention
20 juillet 2012
4 -
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
4 -
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 ;)
cs_askil2000
Messages postés
92
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
12 avril 2010
-
Bonjour,

Hé bien hvb, content de voir une fonction supplémentaire qui marche. J'ai pensé utiliser les indexOf et substring bien avant de faire l'autre fonction, mais pour le coté pratique j'ai préféré utiliser les while, if et boolean.

"Qui-a-t'il d'initié à imbriquer deux boucles et des tests conditionnels ?"

- 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. (qui peuvent biensure l'utiliser)

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

- Si mon code est si simple et si peu original, pourquoi ne trouve-t-on pas le tien sur ce site ?

"Pourtant, je ne proclame en rien que mon code soit l'ultime solution"

- Moi non plus, juste une solution supplémentaire qui n'utilise pas les regex (pour ceux qui savent lire tout en haut) "fonction parallèle qui remplace toutes les occurrences d'un mot dans une chaîne."

"Mais je te trouve juste bien trop sur de toi."

- Oui, dans la vie il faut être sur de sois, sinon on n’arrive à rien.

Bonne prog ;)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.