2010-07-27 15 views
11

Sto provando a creare un metodo di filtro di parolacce che posso chiamare prima di ogni inserto e aggiornamento per controllare la stringa di eventuali parolacce e sostituirla con "[Censored]".Sostituisci le parolacce usando Regex

Ho una tabella SQL con una lista di parolacce, voglio riportarli indietro e aggiungerli ad una lista o ad una stringa di archi e controllare attraverso la stringa di testo che è stata passata e se sono presenti parolacce trovato li sostituisce e restituisce una stringa filtrata.

Sto usando C# per questo.

+6

Probabilmente non è una buona idea aggiorna/inserisci le stringhe censurate senza conservare una copia della stringa non censurata. Molto probabilmente dovrai adattare la tua lista di parole e la strategia di sostituzione per molte iterazioni fino a quando non sarà "abbastanza giusto" e non rischiare di distruggere i tuoi dati nel frattempo –

+4

Ti ha dato un voto solo per chiamarli "Parole cattive". – Chris

risposta

18

Si prega di vedere questo "clbuttic" (o per il vostro caso cl [censurato] IC) articolo prima di fare una stringa sostituire senza considerare i confini di parola:

http://www.codinghorror.com/blog/2008/10/obscenity-filters-bad-idea-or-incredibly-intercoursing-bad-idea.html

Aggiornamento

non

Ovviamente infallibile (vedi articolo sopra - questo approccio è così facile da aggirare o produrre falsi positivi ...) o ottimizzato (le espressioni regolari dovrebbero essere memorizzate nella cache e compilate), ma quanto segue filtra le parole intere (senza "clbuttics") e semplici plurali di parole:

const string CensoredText = "[Censored]"; 
const string PatternTemplate = @"\b({0})(s?)\b"; 
const RegexOptions Options = RegexOptions.IgnoreCase; 

string[] badWords = new[] { "cranberrying", "chuffing", "ass" }; 

IEnumerable<Regex> badWordMatchers = badWords. 
    Select(x => new Regex(string.Format(PatternTemplate, x), Options)); 

string input = "I've had no cranberrying sleep for chuffing chuffings days - 
    the next door neighbour is playing classical music at full tilt!"; 

string output = badWordMatchers. 
    Aggregate(input, (current, matcher) => matcher.Replace(current, CensoredText)); 

Console.WriteLine(output); 

Dà l'output:

ho avuto nessun [Censored] sonno per [Censored] giorni [Censored] - il vicino di casa sta giocando la musica classica a tutta velocità!

Si noti che "classico" non diventa "cl [Censored] ical", poiché le parole intere sono abbinate all'espressione regolare.

Update 2

E per dimostrare un sapore di come questo (e in generale stringa \ modello di base delle tecniche di corrispondenza) può essere facilmente sovvertito, vedere la seguente stringa:

"I' Non ho avuto il sonno del cranberry per i giorni di chuffıng chuffıngs - il vicino di casa sta suonando musica classica a pieno ritmo! "

Ho sostituito le "i" con la lettera minuscola turca non regolata "ı". Sembra ancora abbastanza offensivo!

+1

Un buon articolo di sfondo. Avrei probabilmente messo un commento piuttosto che una risposta, dato che in realtà non risponde alla domanda. –

+0

@Robin Io brucerò all'inferno, ma ho fornito un esempio. –

+0

+1, anche se è un problema difficile/impossibile da risolvere. (Ho visto arcate piene di nome CLINT a causa del font usato!) Preferirei vedere un sacco di errori in orpelli S [Censored] di un browser per bambini pieno di oscenità. –

2

è possibile utilizzare String.Replace() metodo o RegEx classe

4

Anche se io sono un grande fan di Regex, penso che non vi aiuterà qui. Dovresti recuperare la parolaccia in una stringa List o in una matrice di stringhe e usare System.String.Replace sul tuo messaggio in arrivo.

Forse meglio, utilizzare System.String.Split e .Join metodi:

string mayContainBadWords = "... bla bla ..."; 
string[] badWords = new string[]{"bad", "worse", "worst"}; 

string[] temp = string.Split(badWords, StringSplitOptions.RemoveEmptyEntries); 
string cleanString = string.Join("[Censored]", temp); 

Nel campione, mayContainBadWords è la stringa che si desidera controllare; badWords è un array di stringhe, si carica dalla tabella sql di parole non valide e il risultato è cleanString.

+0

che potrebbe trasformare badmington in [Censored] mington –

+1

esattamente! : D - ma seriamente, questo è solo un esempio, non una soluzione ... Non vedo alcun approva nell'uso della regex, qui. – Hinek

+0

e diventa "cattivo" a "" ma non "[censurato]" – Nagg

1

C'è anche un bel articolo su di esso, che può e trovato here

con un po 'abilità html-analisi, è possibile ottenere un elenco di grandi dimensioni con le parolacce da noswear

Problemi correlati