2010-03-23 66 views
0

我有一个字符串,基本上是由逗号分隔的“单词”列表。这些“文字”几乎可以是任何字符,例如“巴特·辛普森,前女友,花花公子,激进的”“简单”文本替换功能

我试图使用JavaScript,jQuery的,无论我可以取代基于什么也没有搜索字符串一个字(在本质上取下字列表)。所以function removeWord(myString, wordToReplace) {...};

,传递上述列为myString的字符串,并传递“哥们”为wordToReplace将返回字符串“巴特辛普森,前女友,基团”

例如,函数被定义为这样的

这里的代码我摆弄周围的线......请帮我找出什么是错了,或者一些替代(更好的)解决方案:
$myString.val($myString.val().replace(/wordToReplace\, /, ""));

回答

4

使用正则表达式,你现在的样子是不是真的有必要。相反,我将字符串分割成令牌并删除搜索词匹配的道理,如果一个作用:

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 

如果有可能,你想搜索包含重复的项目串,你可以使用该函数的本次修改过的版本(indexOf只返回第一个索引,因此需要一个循环来找出所有的人):

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

当我运行这段代码我上调用的indexOf一个“对象不支持此属性或方法”错误。当我警告(令牌)时,它会返回删除空格的字符串。这就像分裂没有返回数组?我可以指定类型来强制它返回一个吗?以某种方式投射它? – YourMomzThaBomb 2010-03-23 19:43:06

+0

'String.split'是一个内置的JavaScript函数,它返回一个数组。是否有可能在某处重写了'String.prototype.split'? – 2010-03-23 19:47:47

+0

那么,jQuery包含在这个项目中,所以也许它使用jQuery分割? – YourMomzThaBomb 2010-03-23 19:48:44

1

不建为稳健性,但这样做你想要什么。

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

如果要替换的单词是列表中的最后一个元素,则失败。 – Brian 2010-03-23 19:35:05

+0

有两个问题:首先,它不会匹配列表中的最后一个项目,因为它后面不会有逗号;其次,它会匹配一个子字符串(例如,如果列表包含'再见',并且要替换的字词是'再见',它会在再见中抓住再见)。 – 2010-03-23 19:35:54

+0

我同意。丹尼尔的解决方案更好。然而,提问者想知道他们的代码出了什么问题,这是让他们的代码工作的最简单方法(声明它还不健壮)。 – brainjam 2010-03-23 20:07:25

0

如果你仍然想使用正则表达式,你可以试试这个:

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 
} 

尽管如此,分裂字符串到一个数组,如果你想操纵你的列表更直观,更好。

+0

我在IE7中遇到了这个问题。出于某种原因使用jQuery修剪功能不会摆脱所有尾随空白!所以这个函数将永远不会匹配传入的单词,因为后面的空格......在Firefox中很适用。 – YourMomzThaBomb 2010-03-23 21:15:58

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'); 

应该把类似的东西

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