2010-03-23 9 views
0

J'ai une chaîne qui est essentiellement une liste de "mots" délimités par des virgules. Ces "mots" peuvent être à peu près n'importe quel caractère, par ex. « Bart Simpson, Ex-petite amie, mec, radical »Fonction de remplacement de texte "simple"

J'essaie d'utiliser javascript, jQuery, tout je peux remplacer un mot basé sur une chaîne de recherche avec rien (en substance, en supprimant le mot de la liste).

Par exemple, la fonction est définie en tant que telle: function removeWord(myString, wordToReplace) {...};

Ainsi, en passant la chaîne ci-dessus comme myString et passant « mec » comme wordToReplace retournerait la chaîne « Bart Simpson, Ex-petite amie, radicale »

est ici la ligne de code que je bricole avec ... s'il vous plaît me aider à comprendre ce qui ne va pas avec elle ou une autre (meilleure) solution:
$myString.val($myString.val().replace(/wordToReplace\, /, ""));

Répondre

4

Utilisation d'expressions régulières la façon dont vous êtes est pas vraiment nécessaire . Au lieu de cela je diviser la chaîne en jetons et supprimer le jeton qui correspond au mot de recherche, si l'on fait:

function removeWord(myString, wordToReplace) 
{ 
    var tokens = myString.split(/\s*,\s*/); // allow for whitespace around the comma 
    var index = $.inArray(wordToReplace, tokens); 

    if (index != -1) 
    { 
     tokens.splice(index, 1); 
    } 

    return tokens.join(", "); // Assumes you want a space after each comma 
} 

var s = "Bart Simpson, Ex-girlfriend, dude, radical"; 
removeWord(s, "dude"); // returns "Bart Simpson, Ex-girlfriend, radical 

S'il est possible pour la chaîne que vous souhaitez rechercher contenir des éléments en double, vous pouvez utiliser cette version modifiée de la fonction (indexOf ne retourne que le premier index, une boucle est nécessaire pour trouver tous):

function removeWord(myString, wordToReplace) 
{ 
    var tokens = myString.split(/\s*,\s*/); 
    var index; 

    while ((index = $.inArray(wordToReplace, tokens)) != -1) 
    { 
     tokens.splice(index, 1); 
    } 

    return tokens.join(", "); 
} 

var s = "Bart Simpson, Ex-girlfriend, dude, radical, dude"; 
removeWord(s, "dude"); // returns "Bart Simpson, Ex-girlfriend, radical 
+0

Quand je lance ce code j'obtiens une erreur « Cet objet ne gère pas cette propriété ou méthode » sur l'appel à indexOf. Quand j'alerte (jetons), il renvoie la chaîne avec les espaces supprimés. C'est comme si split ne renvoyait pas un tableau? Puis-je spécifier le type pour le forcer à en retourner un? Cast-il en quelque sorte? – YourMomzThaBomb

+0

'String.split' est une fonction Javascript intégrée qui retourne un tableau. Est-il possible que vous ayez remplacé 'String.prototype.split' quelque part? –

+0

Eh bien, jQuery est inclus dans ce projet alors peut-être qu'il utilise le split jQuery? – YourMomzThaBomb

1

Non construit pour la robustesse, mais cela fait ce que vous voulez.

function removeWord(myString, wordToReplace) 
{ 
    return myString.replace(wordToReplace+", ", ""); 
}; 

var s = "Bart Simpson, Ex-girlfriend, dude, radical" ; 
s = removeWord(s, "dude") ; // "Bart Simpson, Ex-girlfriend, radical" 
+0

Echoue si le mot à remplacer est le dernier élément de la liste. – Brian

+0

Deux problèmes avec ceci: tout d'abord, il ne correspondra pas au dernier élément de la liste car il n'aura pas de virgule après celui-ci; deuxièmement, il va correspondre à une sous-chaîne (par exemple, si la liste contient 'au revoir' et le mot à remplacer est 'bye', il va attraper le bye au revoir). –

+0

Je suis d'accord. La solution de Daniel est meilleure. Cependant, le demandeur voulait savoir ce qui n'allait pas dans son code, et c'était le moyen le plus simple de faire fonctionner son code (avec un avertissement qu'il n'était pas encore robuste). – brainjam

0

Si vous voulez continuer à utiliser une expression régulière, vous pouvez essayer ceci:

function removeWordFromList(str, word) { 
    return str.replace(
     new RegExp("(^|,\\s*)" + escape(word) + "(\\s*,\\s*|$)", "g"), 
     "$1") // remove the word 
     .replace(/\s*,\s*$/, ""); // remove the trailing comma 
} 

encore, diviser la chaîne en un tableau est plus intuitive et mieux si vous voulez manipuler votre liste.

+0

Je rencontre des problèmes avec cette solution dans IE7. Pour une raison quelconque, l'utilisation de la fonction jQuery ne supprime pas tous les espaces de fin! Donc, cette fonction ne correspondra jamais au mot passé en raison de l'espace de fin ... fonctionne bien dans Firefox tho. – YourMomzThaBomb

0
var text = ",Bart Simpson ,, , Ex-girlfriend, 5 dude ,radical, sth,, dolr, "; 

function removeWord(source, word) 
{ 
    return source 
    // replace multiple delimiters into one 
    .replace(/\s*,[\s*,]*/g, ', ') 
    // trim delimiters 
    .replace(/^,\s*|,\s*$/g, '') 
    // replaces the substring 
    .replace(new RegExp('(^|,\\s)'+word+'($|,\\s)'), function(match, left, right) { 
     left = left.trim(), right = right.trim(); 
     return (left+right).length !== (left.length || right.length) ? ', ': ''; 
    }); 
} 

removeWord(text,'5 dude'); 

devrait apporter quelque chose comme ça

"Bart Simpson, Ex-girlfriend, radical, sth, dolr" 
Questions connexes