IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Remplacer des occurrences dans une phrase


Sujet :

jQuery

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 64
    Points
    64
    Par défaut Remplacer des occurrences dans une phrase
    Bonjour,

    J'ai une fonction, que lors de la saisie, on remplace des mauvais mots par le vide ou bien ***, alors je suis en face d'un problème où le remplacement est effectué seulement pour un seul mot dans la liste:

    DEMO


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
     
     
    function filterString(string, wordsList, replace){
     
    	var string = string.trim();
      var string = string.replace( /\s\s+/g, ' ' ); // remove more than one space	
      var splStr = string.split(' ');
     
      var isTrue = [] // There is no error
      var badWord = [] // store bad words here
      var result; // final result true OR false
      var replace	= []; // list items to replace the bad word
     
      $.each(splStr, function( index, value ) {
      //console.log( index + ": " + value );
      checkBad = $.inArray( value, wordsList );
      //console.log(checkBad);
     
      // if found
      if(checkBad > -1){
      	isTrue.push(1); // there is an error
        //console.log(splStr[index]+' is bad');
        badWord.push(splStr[index]); 
      } else {
      	isTrue.push(0);
        //console.log(splStr[index]+' is good');
      }
     
      //console.log(badWord);
     
    }); // end each
     
    var checkErrors = $.inArray( 1, isTrue );
     
    if(checkErrors > -1){
    	result = true;
    	var sortBadWords = jQuery.uniqueSort( badWord );
      //console.log('List '+sortBadWords);
    } else {
    var result = false;
    var sortBadWords = null;
    }
     
    return [result, sortBadWords, isTrue];
     
    }
     
     
    var wordsList = ['fuck', 'suck'];
    var replace	= ['', '***']; // replace with nothing or with stars
     
     
    $('.wrap').on('keyup', function(){
    	 var value = $(this).val();
     
       badList = filterString(value, wordsList, replace);
      //console.log(badList);
     
     
      if((badList[0]) === true){
      	console.log('is true?: '+badList[0]);
        console.log('list words '+badList[1]);
        console.log(badList[1]);
        var countWords = badList[1].length;
        console.log('There are ' +countWords+ ' word');
        var indexWords = countWords-1;
     
        for ( var i=0; i<=indexWords; i++ ){
        console.log('x '+badList[1][i]);
        	var regex = new RegExp(badList[1][i], 'g');
        	var newW = value.replace(regex, '***');
          //console.log('newW '+newW);
        }
     
      } else {
        console.log('is true?: '+badList[0]);
        var newW = value;
     
      }
     
      console.log('true array '+badList[2]);
     
    if(badList[0]){
    	console.log('There are some bad words');
     
      console.log('first word: '+badList[1][0]);
      console.log('second word '+badList[1][1]);
      console.log('combine words '+badList[1].join(','));
    } else {
    	console.log('Safe string :\)');
    }
     
     
       $('.prev').html(newW).show();
     
    });
    Example:

    salut suck fuck suck salaut fuck
    Résultat:

    salut suck *** suck salaut ***
    Seul le mot "fuck" est remplacé

    Merci a vous

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Voir : http://danielhagnoul.developpez.com/...Surligner.html

    Dans ce Q/R de ma FAQ, je surligne les mots en me servant de la fonction findAndReplaceDOMText() de James Padolsey avec le code :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    findAndReplaceDOMText( $( "article.surligneNorbi", "section.conteneur" )[ 0 ], { 
    	"find" : "Morbi", 
    	"wrap" : "mark" 
    });

    Sur GitHub, l'auteur propose plusieurs options. Dans votre cas, il suffit de remplacer "wrap" par "replace" :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    findAndReplaceDOMText( $( "#monID" )[ 0 ], { 
    	"find" : "Morbi", 
    	"replace" : "" 
    });

    Voir : https://github.com/padolsey/findAndReplaceDOMText

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 64
    Points
    64
    Par défaut
    Y a pas une autre méthode pour le faire, je trouve que la solution est un peu compliquée

  4. #4
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 452
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 452
    Points : 4 601
    Points
    4 601
    Par défaut
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var str = "salut suck fuck suck salaut fuck";
    var badWords = ["fuck", "suck"];
    $.each(badWords, function(i,bw) {
    str = str.replace(new RegExp(bw, "g"), "***");
    });
    console.log(str);
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 64
    Points
    64
    Par défaut
    Merci Doksuri, je l'ai fait a l'inverse, j'ai fait loop sur la phrase et tester le mot:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    var splStr = string.split(' ');
     
      $.each(splStr, function( ind , val ) {
        //console.log('vvv ' +val);
     
    		// check if the string value exists in the forbidden list (no: -1, yes: 0 and above)
        check = $.inArray(val, forbidden);
        //console.log('c '+check+ ' v '+val);
     
        if(check > -1){
        	badStr	= val +' Found';
        	//console.log('value '+val+' found');
        } else {
        	badStr	= 'Fine';
        	//console.log('Fine');
        }
     
        // start building the pattern for new RegExp
        var pattern = forbidden.join('|');
     
         // GOOD START
         // String: sucks fucks us although has suck fucks
         // Result: ***s ***s us although has *** ***s
         // should match the exact word
         var regex = new RegExp('\('+pattern+'\)', 'g');
    		// GOOD END
     
        //var regex = new RegExp('\('+pattern+'\)', 'g');
        //newStr = string.replace(regex, '***');
        //console.log(newStr);
     
        newStr = string.replace(regex, '***');
        console.log(newStr);
     
        });
    Je veux bien la développer en précisant le mot a remplacer et son remplaçant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var bad = [{
    	"fuck": "*",
    	"suck": "**",
    	"damn": "***"
       	}];
    Je n'ai jamais travaillé avec des array multidimensionnelles

    Merci a vous

  6. #6
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 412
    Points : 4 854
    Points
    4 854
    Par défaut
    Code jquery : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var splStr="salut fuck good suck morning damn" ;
    var badWords=[{"fuck":"*","suck":"**","damn":"***"}];
      $.each(badWords,function(i,val) {
     	$.each(val,function(i,j){
        	console.log("val ["+i+"] :"+j);
            if(splStr.indexOf(i)>-1){
            	splStr=splStr.replace(i,j);//remplacement.
            }
        	});
        });
        console.log("splStr après remplacement est :"+splStr);

  7. #7
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    Citation Envoyé par Toufik83
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            if(splStr.indexOf(i)>-1){
            	splStr=splStr.replace(i,j);//remplacement.
            }
    pas besoin du test tu peux faire le replace directement et s'il n'a rien à remplacer il ne fera rien.

    Attention quand même faire une recherche global sinon seule la première occurrence sera remplacé.

    Sinon il existe également
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var t = 'bla blo bla blo bla';
    var c = 'bla';
    var r = 'x!x';
    t = t.split(c).join(r);
    alert(t);

  8. #8
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 412
    Points : 4 854
    Points
    4 854
    Par défaut
    oui NoSmoking, j'ai pas fais compte a la répétition des occurrences, merci d'avoir signaler.
    le code maintenant est
    Code jQuery : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var splStr="salut fuck good suck morning damn suck damn fuck good" ;
    var badWords=[{"fuck":"*","suck":"**","damn":"***"}];
      $.each(badWords,function(i,j) {
     	$.each(j,function(name,valeur){
        	  console.log("["+name+"] :"+valeur);
            splStr=splStr.split(name).join(valeur);
        	});
        });
        console.log("splStr après remplacement est :"+splStr);

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 64
    Points
    64
    Par défaut
    J'ai pris considération de vos codes, finalement j'ai ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    var bad = {
    	"fuck": "*",
    	"suck": "**",
    	"damn": "***"
       	};
     
    var newStr = '';
    var string = 'fuck man suck sucks';
    var splStr = string.split(' ');
     
    //console.log(splStr);
     
    $.each(bad, function (key, val) {
    //console.log(key+' '+val);
    	check = $.inArray(key, splStr);
      //console.log(check);
     
      if(check > -1){
      	//console.log(key +' Found');
        string = string.replace(key, val);
     
      } else {
      	//console.log(key +' Not found');
      }
     
     
    });
     
    console.log(string);
    pas besoin du test tu peux faire le replace directement et s'il n'a rien à remplacer il ne fera rien.
    Je l'ai ajouté pour avertir la personne qui saisie, sinon on peut le supprimer, merci a vous tous

  10. #10
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Ta fonction ne te garantie pas la suppression des « badWords » multiples dans ta chaine.

    Regarde de plus près le code de Doksuri.

  11. #11
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 171
    Points : 64
    Points
    64
    Par défaut
    Effectivement, après le test ça change pas grand chose, alors j'ai mis ce code, je pense que ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    /***** EXCELLENT: Replace bad words *****/
    function checkBadValue(badWords, string) {
        var isErr = [];
        $.each(badWords, function (key, val) {
            //console.log('k'+key+' v'+val);
            $.each(val, function (x, y) {
                //console.log('x '+x+' y'+y);
                var splStr = string.split(' ');
                //console.log(splStr);
                check = $.inArray(x, splStr);
                //console.log(x+' '+check);
                // if any bad word found
                if (check > - 1) {
                    // push it into the array
                    isErr.push(x);
                }
                console.log(isErr.length);
                if ((isErr.length) > 0) {
                    $('.notif').html('Some bad words found ' + isErr.join(', ')).show();
                } else {
                    $('.notif').hide();
                }
                string = string.replace(new RegExp(x, 'g'), y);
            });
        });
        $('.prev').html(string);
    } // end function
     
    var bad = [
        {   'fuck': '*' },
        {   'suck': '**' },
        {   'damn': '***' }
    ];
    $('.wrap').on('keyup', function () {
        var newStr = $(this).val();
        checkBadValue(bad, newStr);
    });

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacer des carractères dans une chaine
    Par Superzobi dans le forum C++
    Réponses: 23
    Dernier message: 02/05/2007, 16h35
  2. [Tableaux] Remplacer des variables dans une chaine
    Par Ricou13 dans le forum Langage
    Réponses: 3
    Dernier message: 28/03/2007, 21h48
  3. [RegEx] Remplacer des caractères dans une string
    Par jexl dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2007, 22h26
  4. Réponses: 4
    Dernier message: 29/08/2006, 17h44
  5. Affichage des chiffres dans une phrases arabe
    Par omda dans le forum Oracle
    Réponses: 4
    Dernier message: 30/09/2005, 13h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo