Expresiones Regulares en PHP
Expresiones Regulares en PHP
Expresiones Regulares en PHP
en PHP
Las expresiones regulares son patrones que permiten
hacer búsquedas y comparaciones de strings muy
precisas
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. La
biblioteca PCRE (Perl Compatible Regular Expressions) es una extensión
incorporada en PHP que permite utilizar expresiones regularesen funciones
para buscar, comparar y sustituir strings en PHP.
Indice de contenido
1. Introducción
3. Metacaracteres : [] \ . * + ? {} | ()
4. Subpatrones
5. Secuencias especiales
1. Introducción
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). Los delimitadores más utilizados son las barras
oblícuas (/), aunque también se pueden utilizar almohadillas #, virgulillas
~... Además de (), [], {}, o <>.
/([A-Z])\w+/
+expresión+
#[a-zA-Z]#
Para escapar valores se utiliza la barra invertida \.
/http:\/\//
#http://#
Podemos ver un ejemplo con una de las funciones más básicas,
_preg_match()_, que devuelve 1 si encuentra el patrón, y 0 si no lo
encuentra:
$abecedario = "abcdefghijklmnñopqrstuvwz";
echo preg_match("/abc/", $abecedario); // Devuelve 1
*Para el ejemplo anterior sería más recomendable utilizar strpos() y strstr(),
que son mucho más rápidas.
$texto = "esto\nes\ntexto\nmultilinea\nlinea";
// Da igual que se incluya el modificador multilínea con \A y \Z:
echo preg_match_all('/linea\Z/im', $texto); // Devuelve: 1
echo preg_match_all('/linea$/im', $texto); // Devuelve: 2
echo preg_match_all('/\Aes/im', $texto); // Devuelve: 1
echo preg_match_all('/^es/im', $texto); // Devuelve: 2
3. Metacaracteres
El símbolo caret ^ y el de dólar $ son metacaracteres. El poder de las
expresiones regulares viene dado por la capacidad de incluir alternativas y
repeticiones en el patrón. Éstas están codificadas en el patrón por el uso
de metacaracteres, que no tienen una representación en el string, sino que
modifican la interpretación del patrón.
Metacarácter Descripción
\ escape
( inicio de subpatrón
) fin de subpatrón
* cuantificador 0 o más
+ cuantificador 1 o más
Metacarácter Descripción
Metacarácter []
Ya hemos visto el funcionamiento de ^ y $. Vamos a ver ahora el de
los corchetes [], que representan una clase carácter, esto es un conjunto de
caracteres que queremos hacer coincidir, y puede ser literalmente [hola], o
en forma de agrupación como [a-z]:
$string = "hola";
echo preg_match("/h[aeiou]la/", $string); // Devuelve 1
// También coincidiría con hala, hela, hila y hula
Si en la clase carácter se presenta un rango, como a-z, significa que puede
coincidir con cualquier carácter del abecedario en minúsculas. En
mayúsculas el rango es A-Z.
$string = '123456789';
// Si se añade un tercer elemento a preg_match_all devuelve un array
con lo encontrado
preg_match_all("/[^2468]/", $string, $matches);
var_dump($matches); // Devuelve array con 1, 3, 5, 7 y 9
El caret sólo es interpretado de esa forma si se coloca al principio, después
se interpreta de forma literal. Podemos filtrar por ejemplo las vocales,
espacios de un string o mayúsculas:
// Filtrar vocales:
$string = 'No coger vocales';
echo preg_match_all("/[^aeiou]/", $string, $matches); // 10
// Filtrar vocales y espacios:
echo preg_match_all("/[^ aeiou]/", $string, $matches); // 8
// Filtrar consonantes:
$string = "NO coger MAYUSCULAS solo minusculas"; // 23
echo preg_match_all("/[^A-Z]/", $string, $matches);
Metacarácter \
Se utiliza como escape de metacaracteres:
$string = '[]';
// Interpreta los corchetes como corchetes
echo preg_match("/\[\]/", $string, $matches);
// Interpreta los corchetes como corchetes dentro de una clase
carácter
echo preg_match("/[\[\]]/", $string, $matches);
O para el uso de secuencias especiales (explicadas después).
Metacarácter .
El punto coincide una vez con cualquier carácter excepto los saltos de
línea como \r y \n:
$string = "6\nf^R\nL";
echo preg_match_all("/./", $string); // Devuelve 5: 6, f, ^, R y L
echo preg_match_all("//", $string); // Devuelve 8 (todos)
// Con la secuencia especial \s se muestra el número de
líneas/espacios:
echo preg_match_all("/\s/", $string); // Devuelve 2 (sólo las líneas)
Metacarácter *
Encuentra cero o más ocurrencias del carácter que le precede:
$string1 = "hla";
$string2 = "hola";
$string3 = "hoooooooola";
echo preg_match("/ho*la/", $string1); // Devuelve 1
echo preg_match("/ho*la/", $string2); // Devuelve 1
echo preg_match("/ho*la/", $string3); // Devuelve 1
Metacarácter +
Encuentra una o más ocurrencias del caracter que le precede:
$string1 = "hla";
$string2 = "hola";
$string3 = "hoooooooola";
echo preg_match("/ho+la/", $string1); // Devuelve 0
echo preg_match("/ho+la/", $string2); // Devuelve 1
echo preg_match("/ho+la/", $string3); // Devuelve 1
Metacarácter ?
Encuentra 0 o 1 ocurrencias del carácter o expresión regular que le
precede. Se utiliza para hacer algún carácter opcional:
$string1 = "hla";
$string2 = "hola";
$string3 = "hoooooooola";
echo preg_match("/ho?la/", $string1); // Devuelve 1
echo preg_match("/ho?la/", $string2); // Devuelve 1
echo preg_match("/ho?la/", $string3); // Devuelve 0
Metacarácter {}
Las llaves indican el número exacto de matches del carácter o grupo de
caracteres que le preceden:
$string1 = "hooola";
$string2 = "hooooola";
$string2 = "hoola";
$string4 = "houiela";
$string5 = "hla";
echo preg_match("/ho{3}la/", $string1); // Devuelve 1
// Si se indica {n,} quiere decir que al menos n elementos
echo preg_match("/ho{3,}la/", $string2); // Devuelve 1
// Si se indica {n, m} quiere decir un número entre n y m
echo preg_match("/ho{2,3}la/", $string3); // Devuelve 1
echo preg_match("/h[aeiou]{4}la/", $string4); // Devuelve 1
echo preg_match("/ho{0}la/", $string5); // Devuelve 1
Metacarácter |
El operador de barra vertical | permite alternar entre posibles
coincidencias:
$string = "marrón";
preg_match("/ma(r{2}ó)n/", $string, $matches);
var_dump($matches);
/*
array (size=2)
0 => string 'marrón' (length=7)
1 => string 'rró' (length=4)
*/
Las capturas se pueden referenciar después mediante un backlash y
un número, dependiendo de la posición de la referencia: \1, \2, \3...
hasta \9. Estas referencias se pueden hacer dentro de la misma expresión
regular, aunque nunca dentro de las clases carácter:
Secuencia Coincidencia
\D Cualquier carácter no numérico
\s Cualquier espacio
\W Cualquier carácter no alfanumérico
Algunos ejemplos:
$string = 'abc123^+*<>?';
// Encontrar sólo caracteres alfanuméricos:
echo preg_match_all("/[\w]/", $string, $matches); // Devuelve 6
// Cualquier carácter:
echo preg_match_all("//", $string, $matches); // Devuelve 13
// Encuentra todo menos caracteres alfanuméricos:
echo preg_match_all("/[\W]/", $string, $matches); // Devuelve 6
// Encuentra todo string que comienza con número:
$string = '4 pares de zapatos';
echo preg_match_all("/^\d/", $string); // Devuelve 1
// Encuentra los espacios
$string = "Esto es un\nejemplo con espacios\n y salto de linea";
echo preg_match_all("/\s/", $string); // Devuelve 10
6. 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. Algunos de ellos son:
Modificador Significado
m Múltiples líneas
Algunos ejemplos:
Declaración Significado
\b Límite de palabra
\B NO límite de palabra
\A Comienzo de string
\z Final de string
Algunos ejemplos: