Las expresiones regulares.

Resumen.

Para mas de uno las expresiones regulares son como una mala pesadilla, también hay quienes afirman que las expresiones regulares son como otro lenguaje de programación dentro de un lenguaje de programación. En este artículo nos dedicaremos a ellas y con ejemplos veremos la lógica de su construcción y sus poderosas utilidades.

Artículo.

No creo que haya un solo programador en el mundo que no haya tenido pesadillas con las expresiones regulares. Su utilidad es inmensa, y son una gran manera de garantizar la seguridad de un sitio Web, pero al mismo tiempo, una expresión mal construida nos puede dar muchos dolores de cabeza hasta que logramos averiguar que esa expresión que construimos a la que le dedicamos tanto tiempo, tenia un fallo.

Otro de los problemas que tienen las expresiones regulares es que de por si solas, no nos sirven para nada, deben estar incrustadas en una estructura condicional que las ejecute y devuelva una respuesta acorde a nuestros propósitos.

Vamos primero con las expresiones regulares, y después nos introduciremos en la estructura mas adecuada para su uso.

Una de las formas mas básicas de expresión regular es aquella que te obliga a introducir un número mínimo de caracteres, podría ser algo como esto:
/^.{4}$/
Esta expresión es de las más sencillas, por no decir la más sencilla que nos podemos encontrar, la explicamos.

Toda expresión regular se encuentra entre unos delimitadores, en este caso /, también podemos usar el delimitador #, tendría el mismo valor.
#^.{4}$# es lo mismo que /^.{4}$/
^ nos indica que es el comienzo de la cadena que vamos a validar.
Punto (.) nos indica que vale cualquier carácter.
El valor entre {} nos indica que la cadena tiene que tener 4 caracteres, ni mas ni menos. Si el valor va seguido de una coma (,){4,} significa que la cadena tendrá 4 o mas caracteres. Si tras la coma hay otro valor {4,25} significa que la cadena tendrá entre 4 y 25 caracteres.
El $ nos indica que ese es el fin de la cadena.
Ahora queremos que la cadena a validar solo contenga valores alfabéticos, quedaría así:
/^[a-z]{3,50}$/
[a-z] indica que la cadena solo puede contener las letras del abecedario, pero ojo, del abecedario ingles. Es decir, esta expresión regular no nos valdría para el español. El motivo, la ñ.
/^[a-zñ]{3,50}$/
Ahora palabras como “niño” superaran la validación, pero si queremos validar un apellido, ya no nos sirve, ya que solo admite letras minúsculas, esto lo podemos solucionar de dos formas:
/^[a-zñÑ]{3,50}$/i o asi­ /^[a-zA-ZñÑ]{3,50}$/ el resultado es el mismo
En el caso de la primera, la (i) tras el delimitador final equipara las letras minúsculas con las mayúsculas, pero OJO, no la “ñ” ya que esta letra no existe en el ingles, por lo que tendríamos que agregarla a los caracteres admitidos.

Otra particularidad en la que difiere el idioma español del inglés, es que en el primero tenemos el signo de acentuación. Para poder validar al señor Núñez tenemos que hacer esta ampliación:
/^[a-zñÑáéíóúÁÉÍÓÚ]{3,50}$/i
Pero esta expresión no nos resulta valida para la validación de la señorita Vanesa Píriz, ya que falta el espacio en blanco. Así la nueva modificación sería:
/^[a-zñÑáéíóúÁÉÍÓÚ ]{3,50}$/i
Y con esto ya podemos validar cosas tan importantes como nombres de usuarios, nombres y apellidos… Pero que pasa si queremos validar el asunto de un mensaje, entonces deberemos también permitir valores numéricos, la modificación seria la siguiente:
/^[a-zñÑáéíóúÁÉÍÓÚ0-9 ]{3,50}$/i
Y si lo que queremos hacer es validar un texto, tendremos que agregar signos de puntuación, y ahora la expresión quedaría así:
'/^[a-zñÑáéíóúÁÉÍÓÚ0-9.:,;-_¿?+\/*\\\= ]{3,500}$/i'
En esta expresión hemos tenido que usar el carácter de escape (\) barra invertida, este escape es preciso para que ciertos caracteres solo se interpreten como ese carácter textual y no tenga un valor operativo dentro de la expresión regular. La barra de división (\/) o para la misma barra de escape, que precisa dos barras invertidas ante ella.

Esta validación sigue teniendo un problema, y es que no valida los saltos de línea, esto lo haremos de la siguiente manera:
'/^[a-zñÑáéíóúÁÉÍÓÚ0-9.:,;-_¿?+\/*\\\= \s]{3,500}$/i'
Y llegados a este punto, estamos en condiciones de hacer un pequeño ejercicio, vamos a validar un código postal español, que como sabemos consta de 5 dígitos y solo puede comenzar con los valores 0 al 5. Vamos a ello, esta es la expresión.
'/^([0-5]{1})?([0-9]{4})$/'
Para validar un valor así, tenemos que hacer una validación por partes, es decir, primero validamos el primer valor y después los 4 siguientes. Para ello usamos los separadores de grupo, los paréntesis (). Indicamos que la cadena tienes que comenzar por los valores 0 al 5 y que solo será el primer valor ^([0-5]{1}) seguidamente usamos la concatenación ? validamos el segundo grupo ([0-9]{4}) y marcamos el final del patrón con $, así de sencillo.

Siguiendo este mismo esquema, vamos a validar ahora algo que siempre esta presente, una dirección de e-mail.
/^([a-z0-9_-]{1})+([a-z0-9._-]{2,40})+(@[a-z0-9._-]{4,30})+\.[a-z]{2,4}$/i
Como sabemos un e-mail tiene la forma usuario@dominio.extension, por tanto lo que vamos a hacer es crear tres grupos y hacer la validación correspondiente a cada uno.

El primer grupo se refiere al nombre de usuario (usuario@dominio.extension), esta parte puede contener puede contener caracteres alfanuméricos, los guiones (-_) y un punto, pero no puede comenzar por punto (.), esto lo hacemos de la siguiente forma: ^([a-z0-9_-]{1}). Continuamos con el nombre de usuario con la expresión casi idéntica, pero que agrega el punto unida mediante un mas (+) ([a-z0-9._-]{2,40}). Continuamos con la imprescindible @ seguida del nombre de dominio y la extensión.

Otro dato que tendremos que validar va a ser la fecha, que aunque puede seguir diferentes formatos, comprendiendo la forma de validar una, ya podemos crear las formas para validar las demás. Así unas formas de fecha comunes son aaaa-mm-dd ó aaaa/mm/dd. Esta validación la podemos hacer con la expresión:
/^([0-9]{4}(\/|-)?[0-9]{2}(\/|-)?[0-9]{2})$/
En esta expresión usamos el condicional | que nos da la opción de usar como separador – o /.

Podemos también validar tipos de archivos mediante expresiones regulares, es esquema es básicamente el mismo:
/(image\/jpeg)|(image\/gif)|(image\/png)$/
O el NIF español:
/^\d{8}[a-z]{1}$/i
Números decimales:
/^[[:digit:].]{1,6}$/
De esta forma podemos permitir valores numéricos y solo letras mayúsculas:
/[[:digit:]].+[[:upper:]]$/
Como podemos ver el uso de las expresiones regulares es tremendamente amplio y nos vale casi para cualquier cosa, por no decir para todo lo que podamos necesitar, eso si, crear expresiones regulares puede ser muy laborioso y precisa de mucha practica. Estas expresiones nos pueden ser de ayuda en muchos casos:
  • [[:alnum:]] cualquier letra o dígito, permite acentos y espacios en blanco
  • [[:alpha:]] cualquier letra
  • [[:digit:]] cualquier dígito
  • [[:lower:]] cualquier letra minúscula
  • [[:punct:]] cualquier marca de puntuación
  • [[:space:]] cualquier espacio en blanco
  • [[:upper:]] cualquier letra mayúscula
Y llegados a este punto, tenemos un buen número de expresiones regulares y hemos visto un poco de la lógica de su uso, pero hasta ahora no tenemos ni idea de cómo aplicarlas. La función preg_match() nos permite un uso de expresiones regulares con la siguiente sintaxis:
if(!preg_match('Expresion regular', $cadena)) die ($mensaje_error);
<?php // Validamos un codigo postal español $cpostal = '61254'; $mensaje_error = 'Dato no valido'; if(!preg_match('/^([0-5]{1})?([0-9]{4})$/', $cpostal)) die ($mensaje_error); echo "<p>El dato es valido</p> <p>$cpostal</p>"; ?>
La función preg_match() aplica la expresión regular a la variable $cpostal, si el dato se ajusta a la expresión regular, lo devuelve y podemos verlo en pantalla, de lo contrario el constructor die devuelve un mensaje de error y detiene la ejecución de todo el código posterior. Por tal motivo esta forma de aplicar expresiones regulares solo es valida para ciertos casos, por ejemplo podemos usarla para proteger los pasos de variable por URL, como en el caso de este mismo artículo. La modificación para este mensaje de error puede ser tan simple como esta:
$error_volver = '<script> window.location="javascript:history.go(-1)"; </script>';
y te enviará de nuevo a la pagina anterior. Pero la forma mas idónea de aplicar expresiones regulares a los datos de un formulario seria la expuesta en el artículo dedicado a la validación de variables , donde se expone el uso de dicha función, recordémosla:
<?php /* Funcion para aplicar expresiones regulares */ function Validar_Datos($dato,$exp_regular){ if(preg_match($exp_regular, $dato)){ // Dato valido $respuesta = 1; return $respuesta; }else{ // Dato NO valido $respuesta = null; return $respuesta; } } // Aplicamos la funcion $validar_dato = Validar_Datos('Pepe,27', '/^[a-z0-9-_]{4,25}$/i'); ?>
Por supuesto hay mas funciones para el manejo de expresiones regulares, aquí solo se ha hecho una breve introducción a este concepto y su uso, espero os haya resultado interesante.
Tags: Expresión || regular || validación || preg_match ||

Comentarios.

Sin comentarios, publica el tuyo.