REMPLACER UN MOT DANS UNE CHAINE

cs_FraGag Messages postés 81 Date d'inscription jeudi 19 février 2004 Statut Membre Dernière intervention 18 avril 2008 - 8 déc. 2007 à 20:34
jdmcreator Messages postés 647 Date d'inscription samedi 30 décembre 2000 Statut Membre Dernière intervention 20 juillet 2012 - 9 févr. 2011 à 01:44
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 7
9 févr. 2011 à 01:44
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 7
7 juil. 2010 à 01:20
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
21 déc. 2007 à 13:59
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 3
21 déc. 2007 à 12:12
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
21 déc. 2007 à 11:15
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 ;)
hvb Messages postés 939 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 27 janvier 2009 3
19 déc. 2007 à 11:11
"Conclusion: cette source est pour les initiés, et pas pour les codeurs en herbe."

Qui-a-t'il d'initié à imbriquer deux boucles et des tests conditionel?
Je te trouve bien arrogant pour quelqu'un qui poste un code si simple et si peu original...

Et tiens... :

function replacez(str1,str2,strz)
{
var i=0
while (i!=-1)
{
i=strz.indexOf(str1,i);
if (i>=0)
{
strz=strz.substring(0,i)+str2+strz.substring(i+str1.length);
i+=str2.length;
}
}
return strz
}

6 fois plus rapide à l'execution (j'ai pris le temps de tester...sous ff avec une chaine de 5ko).
Si ta fonction est "rapide et efficace", alors la mienne est... magique?? non...
Pourtant je ne proclame en rien que mon code soit l'ultime solution, il est écrit super vite, et je pense que les regex sont bien plus efficaces... mais je te trouve juste bien trop sur de toi.
A+ l'initié.
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
10 déc. 2007 à 17:27
La fameuse expression tu réinventes la roue me plait bien.

C'est exactement ça, je réinvente la roue pour que les pro du développement puisse passer à un niveau inférieur, et que les juniors continue à utiliser les blocs sans rien comprendre à la technique des maths appliqués.

Les blocs, des blocs, des blocs nous permettent aucune personalisation! s'qui fait qu'aujourd'hui n'importe qui peut se prendre pour un développeur en utilisant BBCODE ou d'autres variantes.

Je ne suis pas faché avec l'évolution de la prog, bien au contraire, mais la condition première est d'avoir des bases
solides et qu'on soit un minimum attentif à un résonnement logique.

Conclusion: cette source est pour les initiés, et pas pour les codeurs en herbe.

/////////////////////////////////
Arto_8000
je n'ai pas testé ton code et j'avoue qu'il correspond bien à une routine flash. Merci pour cette information utile qui je pense ne pourra pas m'aider pour la suite de mon application hélasse.
/////////////////////////////////

Quand j'aurais résolu mon application, je mettrais un exemple d'utilisation de ma fonction (en détail), qui permettra de comprendre aux inités uniquement, l'une des nombreuses variantes.

/////////////////////////////////
valneandre
Merci de m'avoir noté aussi bien, c'est toujours plaisant d'avoir un peu de reconnaissance.
/////////////////////////////////

BONNE PROG À TOUS !
Palleas_44 Messages postés 130 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 avril 2009
10 déc. 2007 à 15:25
Pour ma part tu réinventes la roue, mais c'est mon point de vue, je préfère le code de Arto_8000, beaucoup plus pertinent et logique je pense ^^"
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
10 déc. 2007 à 14:10
certes certes...
mais pourquoi tant de haine envers les expressions régulières :o)

document.getElementById('chaine').value =
document.getElementById('chaine').value.replace(/:o\)/g, '01');

c'est y pas "plus simple" ? 1 ligne.
probablement beaucoup plus rapide...
@+
valneandre Messages postés 35 Date d'inscription mardi 7 novembre 2006 Statut Membre Dernière intervention 18 septembre 2009
10 déc. 2007 à 10:21
Bonjour Askil 2000
C'est un excellent code, qui m'a bien rendu service.
Je l'ai immédiatement intégré à l'interface utilisateur de mes sites, pour que celui qui dépose un texte puisse facilement y ajouter des balises genre h1, h2, etc..., qui se placent automatiquement en début et fin de la partie de texte sélectionnée.
Merci beaucoup
Richard BACH
ircland Messages postés 99 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 9 septembre 2014
10 déc. 2007 à 03:47
pas du php en javascript je disais de prendre php au lieu... et comment tu voulais je sache que c'est pour du flash ...
Arto_8000 Messages postés 1044 Date d'inscription lundi 7 mars 2005 Statut Membre Dernière intervention 13 juillet 2010 7
10 déc. 2007 à 03:31
Il y a toujours le classique qui fait la même chose en 1 ligne de code.

String.prototype.replaceAll = function (seek, replace)
{
return this.split(seek).join(replace);
}

"test:o".replaceAll(":o","txt"); // Retourne testtxt
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
9 déc. 2007 à 18:07
re:

///////////////////////////////////////////////
ircland > Bah voyons du php en javascript, on aura tout vu...

mon application est une application flash > mais comment j'vais faire avec ton script PHP ????????
pour écrire un smiley de façon dynamique et intélligente ????
sans rafraichissement de page ??????
sans requettes http ?????

arffff !!! vadé rétro satanas

mon code c'est du terminator pure, repérage de cible
MATCH > vérification des bottes
MATCH > vérification des chaussures
MATCH > vérification du blousson

ALL MATCH > terminator say:

je veux tes bottes, tes chaussures, ton blouson et ta moto

///////////////////////////////////////////////
FraGag > les expressions régulières (beurk !)
cs_FraGag Messages postés 81 Date d'inscription jeudi 19 février 2004 Statut Membre Dernière intervention 18 avril 2008
9 déc. 2007 à 17:26
askil2000> En effet, j'avais oublié que replace() ne remplaçait que la première occurence. Personnellement, je me suis mis à apprendre comment fonctionnent les expressions régulières et je trouve ça plus facile, mais tout le monde n'est pas comme moi.
ircland Messages postés 99 Date d'inscription mardi 22 août 2006 Statut Membre Dernière intervention 9 septembre 2014
9 déc. 2007 à 16:30
Pourquoi ne pas utilisé le PHP... beaucoups plus simple ya une fonction deja tous fait...

Disons que la variable $message est ta chaine...

$message = "Bonjour TEST ca TEST va TEST bien ?";
//la on modifi la chaine...
$message = str_replace("TEST", "yop", $message);
// ta chaine est modifier... tous les TEST par yop
//donc $message maintenent devien "Bonjour yop ca yop va yop bien ?"
si tu veux tous modifier les A par la suite tu fait
$message = str_replace("a", "Z", $message);
//tous les devien des Z
//donc message vaut "Bonjour yop cZ yop vZ yop bien ?"


donc tu voie... pour des smile c le meme principe...
et tous ton code devien une ligne...


UTILISATION de str_replace

$var = str_replace("QUOI", "PAR", $CHAINE);

voila :) la simplicité née!
cs_askil2000 Messages postés 92 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 12 avril 2010
9 déc. 2007 à 15:05
SAlut FraGag,

Fonction parallèle qui remplace toute les occurences d'un mot dans une chaine.

LE CODE SUIVANT EST FAUX
/////////////////////////////////////////////////////////
var machaine = "première occurence :o) deuxième occurence :o)";
machaine = machaine.replace(":o)", "01");
document.write(machaine);
/////////////////////////////////////////////////////////

LE CODE SUIVANT EST FAUX
/////////////////////////////////////////////////////////
var re = /:o)/gi;
var str = "Apples :o) are round, and :o) apples are juicy.";
var newstr = str.replace(re, "01");
document.write(newstr);
/////////////////////////////////////////////////////////

- Ma fonction est rapide et efficace, inutile de chercher à
mettre des /g ou /i

- Ma fonction peut être modifiée à l'infini et permettre d'autres traitements plus intéressants.

Avant de mettre un commentaire disant avoir résolue en 3 lignes ma fonction, essayez de comprendre le code et sa méthode de travail par balayage, qui examine lettre par lettre et qui ensuite en trouvant la première du mot à remplacer, fais un deuxième balayage pour voir si le mot correspond.

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
{
// ici le traitement de remplacement
// si le mot correspond
if(k==quoi.length)
{
r=r+par; // on remplace
match=false;
k=0;
}
i++;
}
}
return r;
}
cs_FraGag Messages postés 81 Date d'inscription jeudi 19 février 2004 Statut Membre Dernière intervention 18 avril 2008
8 déc. 2007 à 20:34
Qu'est-ce qui ne va pas avec ceci ?

var machaine = "test :o)";
machaine = machaine.replace(":o)", "01");

Le premier argument de replace peut être une chaîne ou une expression régulière et son deuxième argument peut être une chaîne ou une fonction.

Voir http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:String:replace
Rejoignez-nous