Lección: Capturas y Reemplazos Avanzados en Expresiones Regulares
subpatrones nombrados, reemplazos dinámicos, y delimitadores personalizados para
crear regex más potentes. Usaremos preg_match()
y
preg_replace()
con técnicas avanzadas.
Subpatrones Nombrados
PHP permite capturar fragmentos especÃficos de texto mediante grupos con nombre usando la sintaxis (?P<nombre>...)
. Esta funcionalidad es útil para trabajar con estructuras como fechas, donde se quieren extraer partes especÃficas como el dÃa, mes y año.
Ejemplo práctico: extraer una fecha
<?php
$texto = "Fecha: 24‐09‐2003";
$patron = "/(?P<dia>\d{2})‐(?P<mes>\d{2})‐(?P<anio>\d{4})/";
if (preg_match($patron, $texto, $coincidencias)) {
echo "DÃa: " . $coincidencias["dia"] . "\n";
echo "Mes: " . $coincidencias["mes"] . "\n";
echo "Año: " . $coincidencias["anio"] . "\n";
}
?>
Explicación del patrón
(?P<dia>\d{2})
— Captura dos dÃgitos comodia
.(?P<mes>\d{2})
— Captura dos dÃgitos comomes
.(?P<anio>\d{4})
— Captura cuatro dÃgitos comoanio
.
Salida esperada
DÃa: 24
Mes: 09
Año: 2003
Casos válidos e inválidos
- Válido: "24-09-2003"
- Inválido: "2-9-2003" (dÃgitos incompletos)
- Inválido: "24/09/2003" (separador incorrecto)
Nota
El array $coincidencias
contiene tanto Ãndices numéricos como claves por nombre:
array (
0 => '24-09-2003',
'dia' => '24',
1 => '24',
'mes' => '09',
2 => '09',
'anio' => '2003',
3 => '2003',
)
Delimitadores Personalizados
Usa cualquier carácter no alfanumérico como delimitador (por ejemplo,
#
, {}
, []
).
Convertir URLs en enlaces HTML con preg_replace()
Este ejemplo convierte URLs que comienzan por http://
o https://
en enlaces HTML usando preg_replace()
con una referencia a la coincidencia completa (\\0
).
Ejemplo
<?php
$texto = "Visita http://www.ejemplo.com para más información.";
$patron = "#https?://[a‐zA‐Z0‐9.‐]+\\.(com|net|org)#";
// Coincide con: URLs con http o https, dominio simple, TLD .com/.net/.org
$string = preg_replace($patron, "<a href=\\"\\0\\">\\0</a>", $texto);
echo "$string\\n";
?>
Resultado esperado
Visita <a href="http://www.ejemplo.com">http://www.ejemplo.com</a> para más información.
Notas
- El delimitador
#
evita tener que escapar las barras/
de las URLs. - Se usa
\\0
para referirse a la coincidencia completa dentro de la cadena de reemplazo. - Este patrón es simple y funcional, pero no cubre subrutas ni parámetros de URL.
Convertir múltiples URLs en enlaces
Usamos preg_replace_callback()
.
Ejemplo
<?php
$texto = "Mira http://ejemplo.com y también https://otra.net";
$patron = "#https?://[a-zA-Z0-9.-]+\\.(com|net|org)#";
// Definimos la función de reemplazo
function enlazar_url($coincidencia) {
$url = $coincidencia[0];
return "<a href=\\"$url\\">$url</a>";
}
$string = preg_replace_callback($patron, "enlazar_url", $texto);
echo "$string\\n";
?>
Resultado esperado
Mira <a href="http://ejemplo.com">http://ejemplo.com</a> y también <a href="https://otra.net">https://otra.net</a>
Notas
- La función
enlazar_url()
recibe cada coincidencia como un array. - Devuelve el HTML que se insertará como reemplazo.
- Este método es útil cuando tienes muchas URLs en un mismo texto.