用jquery替换html页面中单词或单词中的一些字符

时间:2013-04-10 01:56:37

标签: javascript jquery regex

我发现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/

谢谢。

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

您提供的代码中的以下行:

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

匹配单词边界(例如空格)。换句话说,它是filter数组中每个单词的全字匹配。

要匹配过滤器中任何出现的单词,无论它们是否作为部分单词出现,您都可以从该单词的开头,结尾或两端删除'\\b'正则表达式。

然而,这种方法并不是很理想。很多合法的,非冒犯性的词语itchsextet等等 - 都会被您的过滤器审查。如果没有:

,这不是一件容易解决的事情
  • 保持字边界约束,如原始代码

  • 为您希望审查的每个令人反感的词语编写自定义正则表达式(可能过于耗时)

你应该注意到没有任何一种方法可以没有误报。

答案 2 :(得分: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/是测试(并因此了解)正则表达式的好地方。