Apuntes php

PHP: Porque a veces necesitas un poco de caos en tu vida.

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 como dia.
  • (?P<mes>\d{2}) — Captura dos dígitos como mes.
  • (?P<anio>\d{4}) — Captura cuatro dígitos como anio.

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.
TOP