用jquery替换html页面中的单词或一些字符
我发现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/
谢谢。
使用区分大小写的选项,不需要边界。
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;
});
这将显示F字和母狗。 – nhahtdh 2013-04-10 02:04:35
如何将“婊子”换成“b ****”? – Fredy 2013-04-10 02:06:42
是否也如此。 – KingKongFrog 2013-04-10 02:08:20
在以下代码行你提供:
var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g');
在字边界匹配(例如,空格)。换句话说,这是对filter
阵列中的每个单词的全字匹配。
来匹配任何发生的词语的过滤器,无论它们是否发生作为部分字,可以从一开始,结束,或正则表达式的两端除去'\\b'
。
但是,这种方法并不是很理想。大量合法的非冒犯性词语 - itch
,sextet
等等 - 将被您的过滤器删减。这是不是一件很简单没有任何解决:
保持单词边界约束的原代码
编写自定义的正则表达式为要审查每一个令人讨厌的单词(也许太耗时)
您应该注意,没有一种方法是没有误报的。
原因你看到你所提到的行为,是因为你写的正则表达式(下面重复)的:
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/是测试的好地方(因此学习)正则表达式。
“本周早些时候,我在一次关于我的新项目的会议上发了言。” “我的皮肤是\ *** \ * Y”。 “通过我* \ * *,我设法通过了考试”。 “他去k \ *** \ * en拿到一些食物” – nhahtdh 2013-04-10 01:59:18
@nhahtdh:是这样的。喜欢:“什么F ***,这****如此闻”。 – Fredy 2013-04-10 02:04:00
我的意思是说明你正在审查那些不应该被审查的事情。 – nhahtdh 2013-04-10 02:07:02