2010-07-27 35 views
11

Estoy tratando de crear un método de filtro de palabras incorrectas al que pueda llamar antes de cada inserción y actualización para verificar la cadena en busca de palabras incorrectas y reemplazarla por "[censurado]".Reemplazar palabras incorrectas usando Regex

Tengo una tabla SQL con una lista de palabras incorrectas, quiero traerlas de vuelta y agregarlas a una lista o matriz de cadenas y verificar a través de la cadena de texto que se ha pasado y si hay malas palabras encontró reemplazarlos y devolver una cadena filtrada.

Estoy usando C# para esto.

+6

Probablemente no sea una buena idea actualice/inserte las cadenas censuradas sin guardar una copia de la cadena sin censura. Lo más probable es que tenga que adaptar su lista de palabras y la estrategia de reemplazo para muchas iteraciones hasta que sea lo suficientemente correcto y no se arriesgue a destruir sus datos mientras tanto –

+4

Le dimos un voto solo por llamarlos 'Palabras malas'. – Chris

Respuesta

18

Consulte este "clbuttic" (o para su caso cl [censurado] ic) del artículo antes de hacer una cadena sustituir sin tener en cuenta los límites de palabra:

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

actualización

Obviamente no

infalible (consulte el artículo anterior: este enfoque es tan fácil de evitar o producir falsos positivos ...) u optimizado (las expresiones regulares deben almacenarse en caché y compilarse), pero lo siguiente filtrará palabras completas (no "clbuttics") y plurales simples de palabras:

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

proporciona la salida:

No he tenido [censurado] sueño durante días [censurado] [censurado] - el vecino de al lado está reproduciendo música clásica a toda velocidad!

Tenga en cuenta que "classical" no se convierte en "cl [Censored] ical", ya que las palabras completas se corresponden con la expresión regular.

Actualización 2

Y para demostrar una idea de cómo esto (y en la cadena \ patrón general de base técnicas de juego) puede ser subvertido fácilmente, ver la siguiente cadena:

"yo' No he dormido nada de arándano durante los días felices: ¡el vecino de al lado está tocando música clásica a toda velocidad! "

He reemplazado las "i" con mayúsculas indizadas "ı" 's. ¡Todavía parece bastante ofensivo!

+1

Buen artículo de fondo. Probablemente lo habría puesto como un comentario en lugar de una respuesta, ya que en realidad no responde la pregunta. –

+0

@Robin arderé en el infierno, pero proporcioné un ejemplo. –

+0

+1, aunque es un problema difícil/imposible de resolver. (¡He visto arcades con el nombre CLINT debido a la fuente utilizada!) Todavía preferiría ver un montón de errores de horrores S [censurados] que un navegador para niños lleno de obscenidades. –

2

puede utilizar String.Replace() método o clase RegEx

4

Aunque soy un gran fan de expresiones regulares, creo que no le ayudará aquí. Debería buscar su palabra incorrecta en una lista de cadenas o en una matriz, y usar System.String.Replace en su mensaje entrante.

Tal vez mejor, utilizar System.String.Split y métodos: .Join

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

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

en la muestra, mayContainBadWords es la cadena que desea comprobar; badWords es una matriz de cadenas, se carga desde la tabla de palabras incorrectas sql y cleanString es su resultado.

+0

que podría convertir badmington en [censurado] mington –

+1

exactamente! : D - pero en serio, esto es solo una muestra, no una solución ... No veo aprobación en el uso de expresiones regulares, aquí. – Hinek

+0

y se convierte en "malo" en "" pero no "[censurado]" – Nagg

1

También hay un buen artículo sobre el tema que puede E encontrado here

con un poco de conocimientos de HTML-análisis, se puede obtener una lista grande con malas palabras de noswear

Cuestiones relacionadas