Apéndice sobre Expresiones Regulares
Vamos a ver los fundamentos de las expresiones regulares (regex). Usaremos el estándar PCRE (Perl-Compatible Regular Expressions), con
funciones como preg_match() y preg_replace().
Cada apartado incluye ejemplos claros, notas de seguridad, y tareas
prácticas. Las expresiones regulares son un concepto avanzado, con cierto misterio, y en su dominio se distingue al artista del artesano.
Introducción a Expresiones Regulares
Una expresión regular es un patrón formado por caracteres que representa un conjunto mayor de cadenas. Este patrón se
compara con un texto (subject) para encontrar coincidencias (matches).
Las regex son universales en muchos lenguajes, pero PHP usa el estándar PCRE (Perl-Compatible Regular Expressions), con
funciones como preg_match().
Ejemplo básico:
<?php
$texto = "El ala aleve del leve abanico";
$patron = "/el/";
preg_match($patron, $texto);
// Coincide: la primera ocurrencia de "el" en el texto.
// No coincide: "al" sin "e" o cadenas sin "el".
// Tampoco coincidiria con "El", aunque se encuentra en primer lugar
// porque la función por defecto es case sensitive
?>
Nota: Los patrones en PHP van entre delimitadores (como /patron/).
Patrones Literales vs. Flexibles
- Literales: Buscan una cadena exacta. Por ejemplo, el patrón
pepecoincide solo con “pepe”.
<?php
$texto = "Usuario: pepe";
$patron = "/pepe/";
// Coincide: "pepe" exacto (por ejemplo, "Usuario: pepe").
// No coincide: "Pepa", "pepito", o "pe pe".
preg_match($patron, $texto);
?>
- Flexibles: Usan metacaracteres para coincidir con patrones variables (por ejemplo,
pep[aeo]coincide con “pepe”, “pepa”, “pepo”).
Nota: Para patrones literales, funciones como strpos() o str_contains() son más rápidas que regex.
Metacaracteres Básicos
Los metacaracteres son símbolos con significados especiales:
.: Cualquier carácter (excepto nueva línea).*: Cero o más repeticiones del carácter/grupo anterior.+: Una o más repeticiones.?: Cero o una repetición.^: Inicio de la cadena.$: Fin de la cadena (antes de un salto de línea).\: Escapa un metacaractér para usarlo literalmente (por ejemplo,\.para un punto).
Ejemplo: Anclas (^, $):
<?php
$texto = "el ala aleve del leve abanico";
$patron = "/^el/";
// Coincide: "el" al inicio del texto.
// No coincide: "el" en medio o al final (por ejemplo, "ala el").
preg_match($patron, $texto);
$patron = "/co$/";
// Coincide: "co" al final del texto.
// No coincide: "co" en medio o al inicio (por ejemplo, "coro").
preg_match($patron, $texto);
?>
Ejemplo: Punto (.) y cuantificadores
(*, +, ?):
<?php
$texto = "el ala aleve del leve abanico";
$patron = "/a.le/"; // 'a', cualquier carácter, 'le' (total, 4)
// NO coincide: "ale" (de "aleve").
$patron = "/a*le/"; // 'le' precedido por 0 o más 'a'
// Coincide: "le" (sin 'a'), "ale"
?>
Cuantificadores personalizados:
<?php
$texto = "aaaaale";
$patron = "/a{2,4}le/"; // 'le' precedido por 2 a 4 'a'
// Coincide: "aale", "aaale", "aaaale".
// No coincide: "ale", "aaaaale".
preg_match_all($patron, $texto);
?>
*={0,}+={1,}?={0,1}
Escapando Metacaracteres
Usa \ para tratar un metacaractér como literal:
<?php
$texto = "El precio es 100$";
$patron = "/100\\$/"; // Busca "100$"
// Coincide: "100$" exacto (por ejemplo, "El precio es 100$").
// No coincide: "100", "100€".
?>
Nota: Para incluir \ en un patrón, usa \\.
Seguridad
- Sanitización: Nunca uses entradas de usuario directamente en patrones sin escaparlas:
<?php
$entrada = filter_input(INPUT_POST, "patron", FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?? "";
$patron = "/" . preg_quote($entrada, "/") . "/";
// Coincide: La entrada sanitizada como literal.
// No coincide: Entradas maliciosas no escapadas.
$texto = "Prueba segura";
preg_match($patron, $texto);
?>
- Eficiencia: Evita patrones complejos que causen backtracking excesivo (por ejemplo,
.*.*).
Recapitulación
- Una expresión regular es un patrón que se compara con un texto para buscar coincidencias. PHP usa el estándar PCRE con funciones
preg_*(). - Los patrones van entre delimitadores:
/patron/. El modificadorihace la búsqueda insensible a mayúsculas:/patron/i. - Metacaracteres clave:
.(cualquier carácter),^(inicio),$(fin),*+?(cuantificadores),\(escape). - Los cuantificadores
{n,m}especifican un rango exacto de repeticiones.*={0,},+={1,},?={0,1}. - Para buscar un metacaractér literalmente, escápalo con
\:\.es un punto,\$es un dólar. - Si el patrón proviene de entrada de usuario, usa siempre
preg_quote($entrada, "/")para evitar inyección de regex. - Para búsquedas literales simples,
strpos()ostr_contains()son más rápidas que regex.
En la próxima lección: clases de caracteres, alternancia y grupos en expresiones regulares.