notifications Notificaciones

Marcar todas como leídas

Ver más

lightbulb_outline

Expresiones regulares en PHP PCRE

timer 6 Min.

remove_red_eye 2017

calendar_today 29/10/19

En los años 90, PHP utilizaba las expresiones regulares POSIX extendido, pero a partir de PHP 5.3.0 (junio de 2009) las expresiones regulares POSIX extendido se consideran obsoletas. Desde PHP 4.2.0 (abril de 2002), PHP cuenta con las expresiones regulares compatibles con Perl (en inglés, PCRE), que siguen la sintaxis y semánticas del lenguaje de programación Perl 5. PCRE por sus siglas en inglés “Perl perel Compatible comparable Regular regilir Expressions axpeishens” es una biblioteca escrita en lenguaje C que implementa expresiones regulares.

Pero qué son y qué hacen las expresiones regulares????

Texto alternativo

Una expresión regular o regex es un patrón que se compara con una cadena objetivo de izquierda a derecha, carácter a carácter. Las expresiones regulares van encerradas en delimitadores, que son cualquier par de caracteres no alfanuméricos excepto la barra invertida \ y el espacio en blanco,la barra invertida en una expresión regular convierte los meta-caracteres a caracteres, es decir, con su significado literal: “.” Los delimitadores más utilizados son las barras oblicuas (/), aunque también se pueden utilizar almohadillas #, virgulillas ~... , veamos un ejemplo, en este ejemplo utilizaremos la función preg_match esta realiza una comparación con una expresión regular, esta función es sensible a mayúsculas y minúsculas, la función devuelve 1 si encuentra el patrón, y 0 si no lo encuentra:

$text = "hola mundo en 123";
echo preg_match("/hola/", $text); // Devuelve 1

Como podemos ver el patrón se encontró por o tanto nos devolvio 0 pero qué pasa si colocamos hola con la primera letra en mayúscula

echo preg_match("/oola/", $text); // Devuelve 0

Para construir una expresión regular necesitamos saber que existen algunos caracteres no alfabéticos que poseen un significado especial en las expresiones regulares estos caracteres son conocidos como metacaracteres a continuación veremos los tipos de metacaracteres.

Básicos.

El primero es signo de intercalación o caret ^, este encuentra el patrón al inicio de la cadena por ejemplo el patrón que es hola ahora es buscado en todo el texto pero qué pasa si queremos que la función a fuerzas busque hola al inicio, en esta situación tendríamos que usar el signo de intercalación:

echo preg_match("/^Hola/", $text));

La función nos regresa 1 porque hola esta en el inicio ahora cambiemos la palabra hola al final:

$text = "mundo en 123 hola";
echo preg_match("/^hola/", $text));

Nos regresa 0 porque hola ya no se encuentra en al inicio, ahora que pasa si queremos que hola este en la parte final, en esta situación usarios el signo de pesos en la parte final para detectar qué hola esta al final:

echo preg_match("/hola$/", $text));

Modificadores

Se utilizar para modificar la forma en que se evalúan las expresiones regulares. Se incluyen justo después del delimitador de la expresión regular y se pueden utilizar varios a la vez. i Como les mencione anteriormente al agregar un patrón entre los delimitadores estos son sensibles a mayusculas y minusculas pero podemos quitar esto usando el modificador i de insensitive al final.

echo preg_match("/Hola/", $text); // Devuelve 0

Al cambiar la letra H a mayúscula la función nos devuelve 0, colocamos la i fuera de los limitadores y probamos.

echo preg_match("/Hola/i", $text);

Como pueden ver nos regresa 1 por qué ahora el patrón se está buscando sin importar si son mayusculas o minusculas.

Agrupadores

Ahora vamos a ver los corchetes[], que representan una clase carácter, esto es un conjunto de caracteres que queremos hacer coincidir, y puede ser literalmente [hola], o usando el metacaracter guión para definir un rango de caracteres dentro de una agrupación. Vamos a ver un ejemplo:

$text = "hola mundo";
echo preg_match("/h[aeiou]la/", $text);

Nos regresa 1 porque después de la h se encuentra una vocal, pero que pasa si cambiamos la vocal por una consonante:

$text = "hlla mundo";
echo preg_match("/h[aeiou]la/", $text);

Nos regresa 0 ahora vamos a especificar un rango en la agrupación:

$text = "hcla mundo";
echo preg_match("/h[a-f]la/", $text);

En este caso c se encuentra en el rango que especificamos por eso nos regresa 1, si colocamos z nos regresa 0:

$text = "hzla mundo";

Ahora vamos a ver los paréntesis(): Los paréntesis en las expresiones regulares permiten crear subpatrones, como pequeños patrones dentro del patrón principal también podemos usar la barra vertical es lo mismo que decir “o” en una lista: por ejemplo queremos obtener un reptil cocodrilo|tortuga|serpiente es decir cocodrilo o tortuga o serpiente. Vamos a ver un ejemplo: Sabes que en la real academia México se puede escribir con J o con X vamos a ver un ejemplo usando los paréntesis: En este caso escribiremos mexico con X en nuestro patron haremos el subpatron para verificar J o X:

$text = "Yo vivo en México";
echo preg_match("/Mé(x|j)ico/i", $text);

Ahora colocamos j

$text = "Yo vivo en Méjico";

Nos regresa 1 pero que pasa si colocamos h

$text = "Yo vivo en Méhico";

Nos regresa 0 porque no encontró ninguna coincidencia.

<?php

$text='leeeer';
$regex='/le{2,4}r/';
echo preg_match($regex,$text);
 ?>

Secuencias de escape

Las secuencias especiales utilizan la barra invertida \ y son conjuntos predefinidos de caracteres que permiten reducir el tamaño de las expresiones regulares. En este ejemplo usaremos la función preg_match_all, esta función nos regresa las coincidencias que encontró en un arreglo: Vamos a ver un ejemplo, en este ejemplo necesito detectar solo números, para esto usamos agrupadores:

$text="Los números son 1 4 5 6";
 preg_match_all("/[0-9]/",$text,$matches);
print_r($matches);

para acortar la expresión y ahorrarnos dos caracteres usaremos la secuencia escapada /b

preg_match_all("/\d/",$text,$matches);

y como pueden ver nos regresa solo los dígitos, ahora si lo que queremos es que no se detecten los números podemos usar /d la D en mayúscula.

preg_match_all("/\D/",$text,$matches);

Y como pueden ver nos regresa solo las letras También tenemos /w, busca coincidencia con cualquier carácter alfanumérico incluido el subrayado. Equivale a “[A-Za-z0-9_]”. Normalmente tendríamos que usar esta expresión

preg_match_all("/[A-Za-z0-9_]/",$text,$matches);

y nos regresa números y letras en la palabra agregamos el símbolo + y el asterisco *

$text="Los numeros son 1 4 5 6 + *";

Y como pueden ver no reconoce estos dos símbolos, para ahorrarnos líneas usando /w

preg_match_all("/\w/",$text,$matches);

Y hace exactamente lo mismo solo usando dos caracteres, y si queremos lo contrario solo usamos w en mayúscula.

preg_match_all("/\W/",$text,$matches);

Y solo nos reconoce los dos signos. http://php.net/manual/es/regexp.reference.escape.php

Cuantificadores

Primero vamos a ver el asterisco * este encuentra cero o más ocurrencias del carácter que le precede, por ejemplo vamos a colocar hola :

$text = "hola";
echo preg_match("/ho*la/", $text);

Como pueden ver nos regresa 1 porque hay una letra o, ahora le agregaremos varias o:

$text = "hoooooola";

Nos sigue regresando 1 y si quitamos todas las o nos seguirá regresando 1 porque como les dije de 0 a más ocurrencias del carácter en este caso O:

$text = "hla";

Después tenemos signo más + este a diferencia del anterior encuentra una o más ocurrencias del carácter que le precede por ejemplo cambiamos el signo:

$text = "hla";
echo preg_match("/ho+la/", $text);

Nos regresa 0 porque es una o más y en este caso no tenemos ninguna O

Ahora veremos el signo de pregunta ? este encuentra 0 o 1 ocurrencias del carácter o expresión regular que le precede. Se utiliza para hacer algún carácter opcional, por ejemplo :

$text = "hla";
echo preg_match("/ho?la/", $text);

Nos regresa 1 porque hay 0 coincidencias,agregamos una O

$text = "hola";

Nos sigue regresando 1 porque hay una coincidencia, por último agregamos varias O:

$text = "hoooola";

Nos regresa 0. Por último usaremos llaves {} estas nos sirven para podemos especificar un número determinado de caracteres, por ejemplo, la O solo se puede repetir hasta 5 veces :

$text = "hooooola";
echo preg_match("/ho{5}la/", $text);

Nos regresa 1 porque son 5 O pero que pasa si agregamos otra O,

 $text = "hoooooola";

Nos regresa 0 porque ya son mas de 5, si queremos tener 5 o más O usamos una coma después del número de veces,por ejemplo:

 $text = "hoooooola";
echo preg_match("/ho{5,}la/", $text);

Como pueden ver ahora nos regresa 1 porque hay mas de de 5, pero si colocamos menos O:

$text = "hoola";

Nos regresa 0 porque tiene que ser mayor o igual a 5: Y si deseamos podemos colocar un rango específico ,agregamos 12 O:

$text = "hoooooooooooola";
echo preg_match("/ho{5,10}la/", $text);

Nos regresa 0 la función porque estamos fuera de lo establecido. Finalizamos con las expresiones regulares pero antes vamos a ver si logramos entender esta expresión regular y tenemos que saber para qué sirve:

echo preg_match("/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/",$text);  
$text='21/10/2018';
echo preg_match("/([0-2][0-9]|3[0-1])(\/|-)(0[1-9]|1[0-2])(\/|-)(\d{4})/",$text);
  1. Primero tenemos los delimitadores

  2. Después se creó un subpatron

    *Se agregaron corchetes y hay un rango donde se aceptan número del 0-9.

    *Se especifica un número de caracteres, en este caso 4.

  3. La barra invertida está convirtiendo en un simple carácter literal a la barra que usamos para delimitador.

  4. Después se creó un subpatron la diferencia con el anterior es que solo acepta dos caracteres.

  5. Barra como un carácter literal

  6. Se agregó un último subpatron igual que el anterior aceptando solo dos caracteres. Ya saben para qué sirve esta expresion regular……., la expresión sirve para validar una fecha que cumpla con un formato agreguemos el texto:

$text="1994/01/01";
echo preg_match("/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/",$text);

Si nosotros borramos una barra nos regresa 0 porque el patrón no coincide con el texto. Como pudieron ver usamos preg_match y preg_match_all pero no solo esas funciones para expresiones regulares existen en php tambien tenemos:

preg_replace

Realiza una búsqueda y sustitución de una expresión regular

preg_filter

Realiza una búsqueda y sustitución de una expresión regular

preg_split

Divide un string mediante una expresión regular Las podemos ver en la documentación oficial de PHP

PCRE en PHP

Otros artículos del blog

Comunidad