Las expresiones regulares en PHP son una potente herramienta de programación que muchas veces se deja de lado ya que se cree que es muy compleja (aunque sí lo puede ser). En este post explicamos de manera sencilla cómo utilizar las expresiones regulares en PHP y brindamos soluciones a ejercicios cotidianos de programación utilizando expresiones regulares. También puede servir como un pequeño recordatorio.
La única salvedad que debemos hacer es que se debe considerar muy bien cuando usar una expresión regular, y no usarlas en exceso. Esto ya que el procesamiento de una expresión regular es considerablemente más costoso que una simple búsqueda de strings (utilizando strstr por ejemplo).
La idea, entonces, de una expresion regular es crear un string especial para hacer una búsqueda en otro string. Si nuestra expresión regular encaja (hace “match”) en el string, la operación es exitosa. Exsite algunos caracteres que tienen un significado especial en una expresión regular:
Metacaracteres
. | Match con cualquier caracter |
^ | Match al principio del string |
$ | Match al final del string |
s | Match con cualquier espacio en blanco |
d | Match con cualquier dígito |
D | Match con cualquier caracter que no sea un dígito |
w | Match con cualquier caracter que pueda ser parte de una palabra (letra, número, guión bajo) |
W | Match con cualquier caracter que NO pueda ser parte de una palabra (letra, número, guión bajo) |
A | Inicio de un string. |
z | Final de un string. |
Cuantificadores
* | el caracter puede aparecer cero o mas veces. |
+ | el caracter puede aparecer una o mas veces. |
? | el caracter puede aparecer cero o una vez. |
{n} | el caracter aparece exactamente n veces. |
{n,} | el caracter aparece n o más veces. |
{n,m} | el caracter puede aparecer entre n y m veces. |
Como parte de la notacion, siempre encerramos las expresiones regulares entre /, llaves ({}) o #. Por ejemplo, la expresion /ab?c/ hace match con ac y abc. La expresión regular /ab{1,3}c/ hace match con abc, abbcy abbbc.
Agrupadores
[] | permiten agrupar creando rangos, por ejemplo /ab[0-5]+c/ hará match con cualquier string que contenga ab, una o más veces un número entre 0 y 5, y finalmente una c. Por ejemplo: ab12c. |
() | Nos permiten crear sub-expresiones, expresiones regulares contenidas dentro de otras: /a(bc.)+e/. Tiene un uso especial en formas como (…), que permite capturar todo lo que encierren los paréntesis, y (a|b) que hace match con a o b |
Modificadores
Permiten cambiar el modo en que se ejecute la expresión regular. Se agregan después del delimitador de cierre.
i | Coincidir indistintamente entre mayúsculas y minúsculas. |
m | Match multilínea. |
s | El metacaracter . hará match también con el caracter de cambio de línea. |
u | Hacer los matches en modo UTF8 |
x | Ignorar espacios. |
Otros modificadoresX,e,A,D,S,U,J ver más |
Funciones PHP
preg_match
Nos permite evaluar si un string hace match con una expresi&ocuate;n regular. Por ejemplo, para validar un email haríamos lo siguiente
function verificar_email($email) { if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/",$email)) { return true; } return false; }
Otros ejemplos interesantes pueden ser:
//1. verificar si un password es seguro function verificar_password_strenght($password) { if (preg_match("/^.*(?=.{8,})(?=.*d)(?=.*[a-z])(?=.*[A-Z]).*$/", $password)) echo "Su password es seguro."; else echo "Su password no es seguro."; } //2. Verificar el fomato de una IPv4 function verificar_ip($ip) { return preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" . "(.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $ip ); } //3. Verificar formato de número telefónico en EU function verificar_telefono_eu($telefono) { $regex = '/^(?:1(?:[. -])?)?(?:((?=d{3})))?([2-9]d{2})' .'(?:(?$0', $text); }
Al usar preg_replace se vuelve muy útil utilizar las retroreferencias. Estas son simplemente una sintaxis para hacer referencia a los matches que ocurrirán al ejecutar una expresión regular. Por ejemplo, para convertir una fecha en formato MM/DD/YYYY a formato DD/MM/YYYY podemos utilizar retroreferencias:
function cambiar_formato_fecha($fecha) { return preg_replace("/([0-9]{4})/([0-9]{2})/([0-9]{2})/i","$3/$2/$1",$fecha); }
Para un guía completa puede visitar el manual de PHP.