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
pepe
coincide solo con “pepe”.
<?php
declare(strict_types=1);
$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
declare(strict_types=1);
$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
declare(strict_types=1);
$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
declare(strict_types=1);
$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
declare(strict_types=1);
$entrada = filter_input(INPUT_POST, "patron", FILTER_SANITIZE_STRING) ?? "";
$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,
.*.*
).