Expresiones regulares en MySql
Pocas cosas son tan universalmente útiles como las expresiones regulares en la programación o en la edición de texto. Podemos definir cualquier patrón escrito con estas perlas de códigos ilegibles y aun asà pocos programadores las usan e incluso muchos hasta las desconocen.
Esta maravillosa herramienta funciona para casi cualquier lenguaje y MySql no se queda afuera ya que la incorpora a partir de su versión 4 5.
Situación:
Tenemos una tabla de miles registros con diferentes comentarios, cientos de ellos son spam y camuflaron su nombre al mejor estilo Ph3nt3rmine. Pero detectamos un patrón, cambian sólo la i y las e por 1 y 3 pero pueden usar mayúsculas y minúsculas (Ph3nt3rminE, PhentErm1n3, PhEntermIn3…).
Solución:
- Generamos una expresión regular que coincida con el nombre malicioso del spammer:
Ph(3|e|E){1}nt(3|e){1}rm(1|i|I){1}n(3|e|E){1}oPh[3eE]nt[3eE]rm[i1I]n[3eE] - Generamos la consulta que borre todos las coincidencias:
DELETE FROM comments WHERE name REGEXP "Ph[3eE]nt[3eE]rm[i1I]n[3eE]" - Ejecutamos la consulta.
si la simplificamos
Eso es todo, borramos todo el spam indeseado con todas sus combinaciones posibles en una sola consulta. Imaginense todo el tiempo que perderÃamos tratando de cubrir todas las combinaciones posibles sin estos preciosos patrones.
Desafortunadamente este comando no puede ser usado en la funcion REPLACE de MySql ya que sólo devuelve true or false, supongo no tardarán mucho en incorporarla al mejor estilo preg_replace de php.










2 Comentarios
MatÃas
febrero 21st, 2008 at 7:31 pm
Siento decepcionarte LZ pero el operador REGEXP ya existÃa de antes :P
http://dev.mysql.com/doc/refman/4.1/en/regexp.html
Lamentablemente REGEXP suele ser bastante lento y para expresiones simples es mejor usar “like”. Sin embargo, para cosas complejas definitivamente es mejor usar REGEXPs.
Por otro lado, los “{1}” en tu expresión sobran :P
Lucas Zallio
febrero 21st, 2008 at 7:39 pm
Gracias MatÃas por las correcciones… yo las uso desde la 5 por eso le pifie. Los 1 sobran, pero era para que paresca más compleja, incluso puede ser más simple usando [iI1] en vez de (1|I|i) Si, soy medio amarillista pero bueno, quien esté libre de pecado que tire la primera piedra XD