Las expresiones regulares son un mecanismo muy potente empleado en programación formado por un conjunto de carácteres y metacarácteres que nos permite definir patrones para realizar busquedas en una cadena o validar sus datos, por ejemplo, las podemos utilizar para validar los datos enviados por un usuario en un formulario web.

A partir de la versión de PHP 5.3.0, el estilo de expresiones regulares POSIX tiene funciones que se consideran obsoletas por lo que vamos a basar este artículo en el estilo PCRE (Perl Compatible Regular Expressions) que en la mayor parte es igual que Perl ya que sigue la misma sintaxis y está disponible a partir de la versión de PHP 4.2.0.

El procesamiento de una expresión regular puede llegar a ser costoso y muy complicado, tanto que algunos programadores evitan usar este mecanismo de programación, aunque por otra parte, es una herramienta que nos puede ayudar a ahorrar mucho tiempo a la hora de resolver un problema.

Expresión regular que identifica un número de teléfono movil de 9 digitos

[0-9]{9}

En el ejemplo anterior indicamos cualquier dígito del 0 al 9 con los corchetes, seguidamente indicamos que el patrón debe repetirse 9 veces con las llaves, las llaves y los corchetes son metacarácteres que indican a PHP un comportamiento específico en el patrón, vamos a repasar las caráctericsticas más importantes.

Delimitadores

La sintaxis de las PCRE requieren que el patrón tiene que comenzar y terminar con un delimitador, que puede ser cualquier carácter no alfanumérico, que no sea una barra invertida ni un espacio en blanco, los más usados son la barra oblícua, “/ … /”, el signo de almohadilla “#” y las virgulillas “~”

Metacarácteres

[ ]  Define un rango o conjunto de carácteres
( )  Define una sub-expresión o subpatrón (expresiones regulares contenidas dentro de otras) que captura el contenido y puede ser referenciado posteriormente
   Define un rango de carácteres
|    Define una expresión alternativa
^   Define que el patrón que lo acompaña está al principio de la cadena
[^]  Niega un conjunto de carácteres
$   Define que el patrón está al final de una cadena
.    Define cualquier carácter excepto los saltos de línea
\    Carácter de escape general

Cuantificadores

*       Define que el patrón se tiene que repetir 0 o más veces
?      Define que el patrón se tiene que repetir 0 o 1 vez
+      Define que el patrón se tiene que repetir 1 o más veces
{ }     Define que el patrón se tiene que repetir un número específico de veces
{x}    Define que el patrón se tiene que repetir x veces
{x,z} Define que el patrón se tiene que repetir un mínimo de x y un máximo de z

Modificadores

i   Define que el patrón coincide indistintamente entre mayúsculas y minúsculas.
m Define que el patrón se aplique a todas las lineas hasta el final del patrón.
s  Define que el carácter . coincide con todos los carácteres, incluyendo nuevas líneas.
Define que se ignoren los espacios en blanco, excepto cuando estén escapados.
u  Define una funcionalidad adicional de PCRE incompatible con Perl, las cadenas son tratados en UTF-8.
Hay más modificadores, puedes ver una lista completa con todos en php.net

Funciones PCRE

preg_grep      Devuelve entradas de matriz que coinciden con el patrón
preg_match_all Realiza una comparación global de una expresión regular
preg_match   Realiza una comparación con una expresión regular
preg_replace Realiza una búsqueda y sustitución de una expresión regular
preg_split      Divide una cadena mediante una expresión regular

Rangos definidos

[[:alpha:]] Define cualquier letra
[[:digit:]]   Define cualquier dígito
[[:alnum:]] Define cualquier letra o dígito
[[:lower:]   Define cualquier letra minúscula
[[:upper:]] Define cualquier letra mayúscula
[[:punct:]] Define cualquier marca de puntuación
[[:space:]] Define cualquier espacio en blanco
[[:ascii:]]   Define caracteres con código ASCII
[[:blank:]]  Define tabuladores o espacios
[[:cntrl:]]   Define caracteres de control
[[:graph:]] Define caracteres de impresión (excepto el espacio)
[[:print:]]   Define caracteres de impresión (incluido el espacio)
[[:word:]]  Define cualquier letra o dígito (incluido el guión bajo)
[[:xdigit:]] Define cualquier dígito hexadecimal

Sintaxis

A continuación os muestro algunas sintaxis básicas de patrones que nos servirán como base de lo que hemos visto hasta
\w  Define cualquier caracter, letra o dígito (expecto Ñ, Ç o acentuados)
\W Define lo contrario de \w, cualquier caracter que no sea una letra o un dígito
\s  Define cualquier caracter que sea un espacio (espacio, tabulador y saltos de linea)
\S Define lo contrario de \s, cualquier caracter que no sea un espacio en blanco
\d Define cualquier dígito
\D Define lo contrario de \d, cualquier caracter que no sea un dígito
[0-9]  Define un rango o conjunto de carácteres numéricos del 0 al 9
[a-z]  Define un rango o conjunto de carácteres de la a a la z (minúsculas)
[A-Z] Define un rango o conjunto de carácteres de la A a la Z (mayúsculas)
[A-z]  Define un rango o conjunto de carácteres de la A a la Z (mayúsculas y minúsculas)
[abc] Define cualquiera de los carácteres a, b o c
[^a]   Niega el carácter indicado, en este caso a
[^a-f] Niega todos los carácteres de la a a la f
a     Define el carácter indicado
abc Define los carácteres indicados (de forma seguida)
^a   Define que el patrón debe comenzar por el carácter indicado
a$   Define que el patrón debe terminar por el carácter indicado
a|b Define uno de los carácteres indicados

Ejemplos

Veamos algunos ejemplos reales en PHP con los que podemos validar campos de un formulario

Validar el campo nombre

<?php
	$valida_nm = $_POST["nombre"];
	if (preg_match("/^[aA-zZ]{3,29}$/", $valida_nm)) {
		echo '<p style="color:green">Nombre correcto</p>'; 
	}else{
		echo '<p style="color:red">Nombre incorrecto</p>'; 
	}
?>

Validar el formato de un correo electrónico

<?php
	$valida_ml = $_POST["correo"];
	if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/",$valida_ml)) { 
		echo '<p style="color:green">Correo electronico valido</p>'; 
	}else {
		echo '<p style="color:red">Correo electronico no valido</p>'; 
	}
?>

Validar la fortaleza de una contraseña

<?php
	$valida_ct = $_POST["contraseña"];
	if (preg_match("/^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z]).*$/", $valida_ct)) {
		echo '<p style="color:green">Contraseña segura</p>'; 
	}else{
		echo '<p style="color:red">La contraseña debe incluir mayúsculas, minúsculas, números, signos y más de seis caracteres</p>'; 
	}
?>

Validar un campo de edad

<?php
	$valida_ed = $_POST["edad"];
	if (preg_match("/^[0-9]{1,2}$/", $valida_ed)) {
		echo '<p style="color:green">Edad correcta</p>'; 
	}else{
		echo '<p style="color:red">Edad incorrecta</p>'; 
	}
?>

Validar un teléfono fijo (España)

<?php
	$valida_tlf = $_POST["telefono"];
	if (preg_match("/^[9|8|6|7][0-9]{8}$/", $valida_tlf)) {
		echo '<p style="color:green">Teléfono correcto</p>'; 
	}else{
		echo '<p style="color:red">Teléfono incorrecto</p>'; 
	}
?>

Validar un teléfono movil (España)

<<?php
	$valida_mv = $_POST["movil"];
	if (preg_match("/^6[0-9]{8}$/", $valida_mv)) {
		echo '<p style="color:green">Movil correcto</p>'; 
	}else{
		echo '<p style="color:red">Movil incorrecto</p>'; 
	}
?>

Estos ejemplos son orientativos y pueden no cumplir con todas las caracteristicas que se necesiten validar en cada campo, o pueden no ajustarse a las necesidades reales en la validación de un campo de formulario, en mi cuenta de Github se pueden ver y descargar los archivos con los ejemplos completos y funcionales: Github

Existen páginas donde podemos testear nuestras expresiones regulares de forma online, como http://regextester.com y http://regexpal.com, espero que el articulo os haya servido como introducción al mundo de las expresiones regulares.

Valoraciones


Sé el primero en valorar

* Tu valoración puede tardar hasta 72 horas en publicarse.

He leido y acepto el Aviso legal y condiciones de uso

Utilizamos cookies propias y de terceros para personalizar el contenido y los anuncios, ofrecer funciones de medios sociales y analizar el tráfico. Además compartimos información sobre el uso que haces de nuestra web con nuestros partners de medios sociales, de publicidad y de análisis web. Si continúas navegando estás dando tu consentimiento para la aceptación de nuestra Política de cookies.

ACEPTAR
Aviso de cookies