2013-04-10 92 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/是测试的好地方(因此学习)正则表达式。

相关问题