2016-04-06 6 views
0

Auf meiner Website habe ich ein Kommentarfeld, in das die Leute schreiben können, was sie wollen. Um Spam und unserious Kommentare zu vermeiden, verwende ich einen Winkelfilter auf diese Weise:Verwendung eines einfachen Winkelfilters zum Ersetzen aller Vorkommen bestimmter Strings in der Eingabezeichenfolge, unabhängig von Groß- und Kleinschreibung

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

Der Winkelfilter holt ein Array mit verbotenen Wörter und Scans durch die Eingabezeichenfolge und ersetzt alle Vorkommen der abgerufenen Wörter. Der Code für den Filter ist wie folgt:

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 ist so etwas wie dieses:

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

So als Beispiel <span>{{ "fuck this" | mouthWash}}</span> als ausgegeben wird <span>mooh this</span>

Dies ist funktioniert perfekt, außer dass ich weiße Räume ignorieren möchte, um sie kugelsicherer zu machen. Ich habe nicht viel Erfahrung mit Regex, also wenn jemand eine einfache Lösung dazu hätte, wäre ich wirklich dankbar.

Antwort

0

Dies ist der Code, den ich am Ende mit:

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; 
     }; 

    }); 

Ich habe eine for-Schleife erstellt, die jedes Zeichen des gesperrten Wortes durchläuft und das Zeichen zusammen mit \s* (so dass Leerzeichen ignoriert wurden) zu einem String hinzufügt.

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

erstellt dann ein regExp aus dem String, durch den regExp Konstruktor mit der Zeichenfolge als erste Parameter und „gi“ als zweite Verwendung des regExp globalen und Groß- und Kleinschreibung zu machen.

Dann wurde diese Regex verwendet, um Eingabezeichenfolge zu durchsuchen und alle Übereinstimmungen mit "Mooh" zu ersetzen.

0

ändern, nur new RegExp(word, "ig");-new RegExp("ig");

Arbeitsbeispiel:

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

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

Ausgang:

"pmooh" 
    "dog" 
    "" 
    " " 
    "cow" 
+0

Es tut mir leid, wenn meine Frage unklar war, aber das löst es nicht. Ich weiß nicht, ob Sie irgendwelche Erfahrungen mit Winkel haben, aber die Idee eines Filters ist, dass Sie Variablen filtern können und eine gefilterte Version der Variablen zurückgegeben wird. In Ihrem Beispiel wird die Eingabe weder geändert noch zurückgegeben. – tjespe