1

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

谢谢你。

4

3 回答 3

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/

于 2013-04-10T02:03:20.200 回答
0

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

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

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

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

然而,这种方法并不理想。大量合法的、非冒犯性的词 - itchsextet等 - 将被您的过滤器审查。如果没有以下任何一项,这不是一件容易解决的事情:

  • 保持原代码中的单词边界约束

  • 为您希望审查的每个冒犯性词编写自定义正则表达式(可能太耗时)

您应该注意,没有一种方法不会没有误报。

于 2013-04-10T02:04:16.007 回答
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/是测试(并因此学习)正则表达式的好地方。

于 2013-04-10T02:11:55.143 回答