feb 08 21

Expresiones regulares en MySql

Tiempo estimado de lectura: 1,02 minutos

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:

  1. 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} o Ph[3eE]nt[3eE]rm[i1I]n[3eE]
  2. si la simplificamos

  3. Generamos la consulta que borre todos las coincidencias:
    DELETE FROM comments WHERE name REGEXP "Ph[3eE]nt[3eE]rm[i1I]n[3eE]"
  4. Ejecutamos la consulta.

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.

Copame! Digg it Digg it Reddit Del.icio.us

    2 Comentarios

  1. Matías


    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

  2. Lucas Zallio


    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

Deja un Comentario

Tags permitidos:

  • <a href="" title="">
  • <abbr title="">
  • <acronym title="">
  • <blockquote cite="">
  • <code>
  • <em>
  • <strong>