2011-03-12 117 views
4

我試圖用文本字符串替換一組單詞。現在我有一個循環,不執行得好:替換字符串中的褻瀆詞的正則表達式

function clearProfanity(s) { 
    var profanity = ['ass', 'bottom', 'damn', 'shit']; 
    for (var i=0; i < profanity.length; i++) { 
     s = s.replace(profanity[i], "###!"); 
    } 
    return s; 
} 

我想要的東西,工作速度更快,並且東西,這將與具有相同長度的原詞###!馬克更換壞詞。

+4

嘿,「底部」是褻瀆? – kennytm 2011-03-12 11:46:23

+0

我試圖成爲溫柔的...... – 2011-03-12 11:52:31

+0

+1,我喜歡代碼很有趣 – smartcaveman 2011-03-12 11:54:39

回答

3

看到它的工作: http://jsfiddle.net/osher/ZnJ5S/3/

這基本上是:

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

這將是更好,如果PROFANITY陣列將啓動一個字符串,或更好 - 直接作爲正則表達式:

//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 
+0

感謝您的所有解釋! – 2011-03-12 12:02:30

+0

@ Don-Joy @Radagast the Brown - 那麼發生了什麼「無偏見」?這實在太簡單了。正則表達式確實需要尋找單詞邊界。 – Pointy 2011-03-12 12:04:29

+0

是的,它很簡單,但它不是一個褻瀆引擎,它是一個簡單的客戶端JS功能,掩蓋了我的背後。這對我來說已經夠好了。 – 2011-03-12 12:17:14

4

以下是一種方法:

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); 
+0

謝謝單詞邊界處理。但是,請注意,從預先準備的預先提取的字符串中切割比循環中的字符串更好,這是針對您希望替換的每個事件完成的。 – 2016-06-15 11:01:31