2013-04-10 48 views
1

我發現jquery代碼(我忘了原來的網站)正在努力將html頁面中的單詞替換爲星號(*),並且代碼運行良好,但代碼只能用於替換每個單個單詞,不能更改單詞的部分並且還區分大小寫。用jquery替換html頁面中的單詞或一些字符

jQuery代碼:

String.prototype.repeat = function(num){ 
    return new Array(num + 1).join(this); 
} 

/* Word or Character to be replace */ 
var filter = ['itch','asshole', 'uck', 'sex']; 
$('body').text(function(i, txt){ 
    // iterate over all words 
    for(var i=0; i<filter.length; i++){ 
    // Create a regular expression and make it global 
    var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g'); 
    // Create a new string filled with '*' 
    var replacement = '*'.repeat(filter[i].length); 
    txt = txt.replace(pattern, replacement); 
    } 
    // returning txt will set the new text value for the current element 
    return txt; 
}); 

詞過濾:

['itch','asshole', 'uck', 'sex']; 

和結果:

sex -> *** // successfully replacing 
SEX -> SEX // not replaced, i want this word also replaced to *** 
bitch -> bitch // not replaced, i want this word replaced to b**** 

如何修改這個jQuery代碼,以便可以用來改變一些字中的字符而不區分大小寫?

小提琴:http://jsfiddle.net/bGhq8/

謝謝。

+2

「本週早些時候,我在一次關於我的新項目的會議上發了言。」 「我的皮膚是\ *** \ * Y」。 「通過我* \ * *,我設法通過了考試」。 「他去k \ *** \ * en拿到一些食物」 – nhahtdh 2013-04-10 01:59:18

+0

@nhahtdh:是這樣的。喜歡:「什麼F ***,這****如此聞」。 – Fredy 2013-04-10 02:04:00

+0

我的意思是說明你正在審查那些不應該被審查的事情。 – nhahtdh 2013-04-10 02:07:02

回答

1

使用區分大小寫的選項,不需要邊界。

String.prototype.repeat = function(num){ 
    return new Array(num + 1).join(this); 
} 

/* Word or Character to be replace */ 
var filter = ['itch','asshole', 'uck', 'sex']; 
$('body').text(function(i, txt){ 
    // iterate over all words 
    for(var i=0; i<filter.length; i++){ 
    // Create a regular expression and make it global 

    var pattern = new RegExp(filter[i] , 'gi'); // Add the "i" modifier for case insensitivity 
    // Create a new string filled with '*' 
    var replacement = '*'.repeat(filter[i].length); 
    txt = txt.replace(pattern, replacement); 
    } 
    // returning txt will set the new text value for the current element 
    return txt; 
}); 

更新撥弄: http://jsfiddle.net/bGhq8/3/

+0

這將顯示F字和母狗。 – nhahtdh 2013-04-10 02:04:35

+0

如何將「婊子」換成「b ****」? – Fredy 2013-04-10 02:06:42

+0

是否也如此。 – KingKongFrog 2013-04-10 02:08:20

0

在以下代碼行你提供:

var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g'); 

在字邊界匹配(例如,空格)。換句話說,這是對filter陣列中的每個單詞的全字匹配。

來匹配任何發生的詞語的過濾器,無論它們是否發生作爲部分字,可以從一開始,結束,或正則表達式的兩端除去'\\b'

但是,這種方法並不是很理想。大量合法的非冒犯性詞語 - itch,sextet等等 - 將被您的過濾器刪減。這是不是一件很簡單沒有任何解決:

  • 保持單詞邊界約束的原代碼

  • 編寫自定義的正則表達式爲要審查每一個令人討厭的單詞(也許太耗時)

您應該注意,沒有一種方法是沒有誤報的。

0

原因你看到你所提到的行爲,是因爲你寫的正則表達式(下面重複)的:

var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g'); 

對於初學者來說,得到這個在不區分大小寫的方式替換值,你需要添加「i」標誌爲不區分大小寫

var pattern = new RegExp('\\b' + filter[i] + '\\b', 'gi'); 

此外,它只是更換整個單詞的原因是因爲這個詞的邊界標誌(\ b)被放置在周圍搜索條件。如果您不想限制自己替換整個單詞,則需要考慮替換哪些其他模式,以及如何替換它們。一個可能的解決方案,讓你更接近一點,通過允許零個或一個字母前的格局將是:

var pattern = new RegExp('\\b([A-Z]?)' + filter[i] + '\\b', 'gi'); 
var replacement = '$1'+'*'.repeat(filter[i].length); 
txt = txt.replace(pattern, replacement); 

作爲一個側面說明http://regexpal.com/是測試的好地方(因此學習)正則表達式。

相關問題