0

在我的网站上,我有一个评论区,人们可以在其中写任何他们想写的东西。为了防止垃圾邮件和不严肃的评论,我以这种方式使用角度过滤器:

<span>{{comment | mouthWash}}</span>

角度过滤器获取包含禁用词的数组并扫描输入字符串并替换所有出现的获取词。过滤器的代码如下:

app.filter('mouthWash', function($http) {

  var badWords;
  $http.get('js/objects/bad-words.json').success(function (data) {
    badWords = data;
  });

  return function(input) {
    angular.forEach(badWords, function(word){
      var regEx = new RegExp(word);
      input = input.replace(regEx, "mooh");
    });
    return input;
  };

});

bad-words.json是这样的:

["fuck", "ass", "shit", etc...]

所以作为一个例子<span>{{ "fuck this" | mouthWash}}</span>输出为<span>mooh this</span>

这是完美的工作,除了我希望它忽略空格,使其更加防弹。我对正则表达式没有太多经验,所以如果有人对此有一个简单的解决方案,我将不胜感激。

4

2 回答 2

0

只需更改new RegExp(word, "ig");new RegExp("ig");

工作示例:

var words = ['pig', 'dog', '', ' ', 'cow'];

words.forEach(function(word) {
     var regEx = new RegExp("ig");
     word = word.replace(regEx, "mooh");
    console.log(word);
});

输出:

    "pmooh"
    "dog"
    ""
    " "
    "cow"
于 2016-04-06T19:14:24.300 回答
0

这是我最终得到的代码:

    app.filter('mouthWash', function($http) {

      var badWords;
      $http.get('js/objects/bad-words.json').success(function (data) {
        badWords = data;
      });

      return function(input) {

        angular.forEach(badWords, function(word){
          var str = word.substring(0,1)+"\\s*";
          for (var i = 1; i < word.length - 1; i++) str = str + word.substring(i,i+1)+"\\s*";
          str = str + word.substring(word.length - 1,word.length);
          var regEx = new RegExp(str, "gi");
          input = input.replace(regEx, "mooh");
        });

        return input;
      };

    });

我创建了一个 for 循环,它将遍历禁用词的每个字符,将字符与\s*(以便忽略空格)一起添加到字符串中。

for (var i = 1; i < word.length - 1; i++) str = str + word.substring(i,i+1)+"\\s*";

然后从字符串创建一个regExp,通过使用regExp以字符串作为第一个参数和“gi”作为第二个参数的构造函数,使regExp全局和大小写不敏感。

var regEx = new RegExp(str, "gi");

然后该正则表达式用于搜索输入字符串并将所有匹配项替换为“mooh”。

于 2016-04-07T18:22:10.020 回答