Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用于替换字符串中亵渎词的正则表达式_Javascript_Profanity - Fatal编程技术网

Javascript 用于替换字符串中亵渎词的正则表达式

Javascript 用于替换字符串中亵渎词的正则表达式,javascript,profanity,Javascript,Profanity,我正在尝试替换文本字符串中的一组单词。现在我有一个循环,它的性能不好: function clearProfanity(s) { var profanity = ['ass', 'bottom', 'damn', 'shit']; for (var i=0; i < profanity.length; i++) { s = s.replace(profanity[i], "###!"); } return s; } 函数清除亵渎{ 变量亵渎=[“屁股”

我正在尝试替换文本字符串中的一组单词。现在我有一个循环,它的性能不好:

function clearProfanity(s) {
   var profanity = ['ass', 'bottom', 'damn', 'shit'];
   for (var i=0; i < profanity.length; i++) {
      s = s.replace(profanity[i], "###!");
   }
   return s;
}
函数清除亵渎{
变量亵渎=[“屁股”,“屁股”,“该死”,“狗屎];
for(var i=0;i<亵渎。长度;i++){
s=s.replace(亵渎,“#####!”;
}
返回s;
}
我想要一种工作速度更快的东西,一种用
####替换坏单词的东西与原始单词具有相同长度的标记。

查看其工作原理:

基本上是:

var PROFANITY = ['ass','bottom','damn','shit']
  , CENZOR = ("#####################").split("").join("########")
  ;
PROFANITY  = new RegExp( "(\\W)(" + PROFANITY.join("|") + ")(\\W)","gi");

function clearProfanity(s){
    return s.replace( PROFANITY
                    , function(_,b,m,a) { 
                         return b + CENZOR.substr(0, m.length - 1) + "!" + a
                      } 
                    );
}


alert( clearProfanity("'ass','bottom','damn','shit'") );
最好将
亵渎
数组作为字符串启动,或者直接作为正则表达式启动:

//as string
var PROFANITY = "(\\W)(ass|bottom|damn|shit)(\\W)";
PROFANITY = new RegExp(PROFANITY, "gi"); 

//as regexp
var PROFANITY = /(\W)(ass|bottom|damn|shit)(\W)/gi

这里有一种方法:

String.prototype.repeat = function(n){
    var str = '';
    while (n--){
        str+=this;
    }
    return str;
}

var re = /ass|bottom|damn|shit/gi
  , profane = 'my ass is @ the bottom of the sea, so shit \'nd damn';

alert(profane.replace(re,function(a) {return '#'.repeat(a.length)}));
//=>my ### is @ the ###### of the sea, so #### 'n ####
完整点:这里有一个更简单的方法,考虑到单词边界:

var re = /\W+(ass|shit|bottom|damn)\W+/gi
      , profane = [ 'My cassette of forks is at the bottom'
                   ,'of the sea, so I will be eating my shitake'
                   ,'whith a knife, which can be quite damnable'
                   ,'ambassador. So please don\'t harrass me!'
                   ,'By the way, did you see the typo'
                   ,'in "we are sleepy [ass] bears"?']
                  .join(' ')
                  .replace( re, 
                              function(a){ 
                                return a.replace(/[a-z]/gi,'#'); 
                              } 
                   );
alert(profane);

嘿,“屁股”是一种亵渎+1、我喜欢代码的趣味性我能建议在实现你自己的过滤器之前先阅读亵渎过滤器的问题吗?是的,但我不想走那么远。。。无论如何谢谢:)我不想作为答案发布,因为我编写了插件。看看这本书。它的编写允许“选择加入”亵渎过滤,并且不会将
刺客
变成
*****in
谢谢您的解释@Don Joy@Radagast the Brown——那么“无偏见”会发生什么呢?这真是一个太简单的方法。正则表达式确实需要寻找单词边界。是的,它相当简单,但它不是亵渎引擎,它是一个简单的客户端JS函数,涵盖了我的背后。对我来说已经足够好了。@Pointy是对的。我添加了单词boundries的处理为单词boundry处理添加了hanks。但是,请注意,从给定的预先准备好的字符串中进行剪切要比在循环中串联字符好,循环中的每个字符都要替换。