首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何通过`replace`方法将多个关键字替换为对应的关键字?

如何通过`replace`方法将多个关键字替换为对应的关键字?
EN

Stack Overflow用户
提问于 2012-12-24 01:50:39
回答 3查看 40.9K关注 0票数 22

我想做一个内容可编辑的div,在其中我用星号替换显式的单词。这是我的JavaScript代码:

代码语言:javascript
复制
function censorText(){
    var explicit = document.getElementById("textbox").innerHTML;
    var clean = explicit.replace(/"badtext1","cleantext1"|"badtext2","cleantext2"/);
    document.getElementById("textbox").innerHTML = clean;
}

这是我的<div contenteditable>的超文本标记语言

代码语言:javascript
复制
<div contenteditable="true" onkeyup="censorText()" id="textbox">Hello!</div>

如您所见,我尝试使用正则表达式操作符一次替换多个字符串,但不起作用。它不会用cleantext2代替badtext2,而是用0代替badtext1。如何让一条.replace()语句替换多个字符串?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-24 02:03:42

使用/.../g指示全局替换。

代码语言:javascript
复制
var clean = explicit.replace(/badtext1/g,"cleantext2"/).replace(/cleantext1/g,"cleantext2"/).replace(/badtext2/g,"cleantext2"/);
票数 28
EN

Stack Overflow用户

发布于 2012-12-24 02:46:15

处理此问题的一般方法如下:

建立字典并构建regexp:

代码语言:javascript
复制
  var dictionary = { bad: 'good', worse: 'better', awful: 'wonderful'},
      regexp = RegExp ('\\b(' + Object.keys (dictionary).join ('|') + ')\\b', 'g');

正则表达式是由字典关键字构造的(注意,它们不能包含regexp特殊字符)。

现在做一次替换,用一个函数代替替换字符串,该函数只返回相应键的值。

代码语言:javascript
复制
  text = text.replace (regexp, function (_, word) { return dictionary[word]; });

OP没有提到大写/小写。下面的代码迎合了首字母和全部大写,并将代码包装为一个函数:

代码语言:javascript
复制
  function clean (text) {
    var dictionary = { bad: 'good', worse: 'better', awful: 'wonderful'},
        regexp = RegExp ('\\b(' + Object.keys (dictionary).join ('|') + ')\\b', 'ig');

    return text.replace (regexp, function (_, word) { 
      _ = dictionary[word.toLowerCase ()];
      if (/^[A-Z][a-z]/.test (word)) // initial caps
        _ = _.slice (0,1).toUpperCase () + _.slice (1);
      else if (/^[A-Z][A-Z]/.test (word)) // all caps
        _ = _.toUpperCase ();
      return _;
    });
  }

请看小提琴:http://jsfiddle.net/nJNq2/

票数 11
EN

Stack Overflow用户

发布于 2012-12-24 02:14:44

我认为金招的答案已经涵盖了这一点,但还有一些其他的注释。

1)不要在RegEx中使用“

2)您可以匹配多个字符串,但我认为只能使用单个RegEx替换为一个值。我能想到的匹配多个的唯一方法就是像金招一样。

下面的代码片段似乎适用于我:

代码语言:javascript
复制
function censorText(){             
    var explicit = document.getElementById("textbox").innerHTML;
    var clean = explicit.replace(/bad|worse/gi,"good");
     document.getElementById("textbox").innerHTML = clean;
}

我发现的另一个问题是,当替换发生时,它会将光标返回到文本框的开头,这将变得令人沮丧。如果我找到了答案,我会发帖的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14013223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档