Tema 8 · Modificadores

Modificadores PCRE: i (Insensible), m (Multilínea), s (Dotall) y u (UTF-8)

Altera el comportamiento global del motor con banderas (flags) esenciales: i para ignorar mayúsculas, m para multilínea, s para abarcar saltos con punto, y u para tildes y emojis UTF-8.

¿Qué son los Modificadores de Patrón (Flags)?

Los modificadores de patrón son letras individuales que se colocan inmediatamente después del delimitador de cierre de la expresión regular (por ejemplo: /patron/iu).

Estas banderas no modifican qué caracteres se buscan, sino las reglas de compilación e interpretación con las que el motor PCRE ejecutará el análisis.

Los Modificadores Imprescindibles en PHP

Bandera Nombre Técnico Efecto en el Motor PCRE
i Caseless Insensible a mayúsculas y minúsculas: Las letras mayúsculas y minúsculas coinciden indistintamente (ej: /php/i coincide con "PHP", "Php" o "php").
m Multiline Modo Multilínea: Las anclas ^ y $ coinciden al inicio y fin de cada línea individual (tras un salto \n), en lugar de coincidir solo al inicio y fin absoluto del texto completo.
s Dotall Punto Universal: Hace que el metacarácter punto . coincida con absolutamente cualquier carácter, incluyendo saltos de línea (\n). Sin este modificador, el punto se detiene al llegar al final de una línea.
u UTF-8 Soporte Completo Unicode: Trata la cadena como caracteres multibyte UTF-8 válidos. Es esencial en español para que \w y clases alfabéticas reconozcan tildes (á, é, í, ó, ú), la ñ y caracteres especiales.
x Extended Modo Extendido: Ignora los espacios en blanco dentro del patrón y permite comentarios con #. Ideal para documentar expresiones regulares muy largas y complejas.

El Modificador x: Regex Auto-Documentada

Las expresiones regulares complejas suelen ser difíciles de leer y mantener. Con el modificador x, puedes distribuir el patrón en múltiples líneas y añadir comentarios explicativos:

$patronFecha = '/
    ^                   # Inicio de texto
    (?P<anio>\d{4})     # Año (4 dígitos)
    -                   # Guion separador
    (?P<mes>0[1-9]|1[0-2]) # Mes (01 a 12)
    -                   # Guion separador
    (?P<dia>0[1-9]|[12]\d|3[01]) # Día (01 a 31)
    $                   # Fin de texto
/x';

⚡ El Poder del Modificador /u (UTF-8) y /s (Dotall) en PHP

Ejemplo interactivo. Comparamos cómo se comportan las coincidencias con tildes y saltos de línea con y sin sus modificadores:

modificadores_demo.php
Solo lectura
<?php
// Caso A: El modificador /u con texto en español (tildes y eñes)
$palabraEspanol = "Año2026";

// Sin /u, \w en PHP solo reconoce [a-zA-Z0-9_] (la 'ñ' no coincide)
$patronSinU = '/^\w+$/';
$patronConU = '/^\w+$/u';

echo "<div style='font-family:system-ui; max-width:640px; padding:15px;'>";
echo "<h3 style='color:#0f172a; margin-top:0;'>🇪🇸 Caso 1: Validación UTF-8 con /u</h3>";
echo "<p style='color:#64748b; font-size:13px;'>Palabra evaluada: <strong>$palabraEspanol</strong> (contiene 'ñ')</p>";

$resSinU = preg_match($patronSinU, $palabraEspanol) === 1;
$resConU = preg_match($patronConU, $palabraEspanol) === 1;

echo "<div style='display:flex; gap:10px; margin-bottom:15px;'>";
echo "  <div style='flex:1; background:" . ($resSinU ? '#ecfdf5' : '#fef2f2') . "; border:1px solid " . ($resSinU ? '#a7f3d0' : '#fecaca') . "; padding:10px; border-radius:6px;'>";
echo "    <strong>Sin /u (/^\\w+$/):</strong><br><span style='color:" . ($resSinU ? '#059669' : '#dc2626') . "; font-weight:bold;'>" . ($resSinU ? 'Coincide' : '❌ Falla (rechaza la ñ)') . "</span>";
echo "  </div>";
echo "  <div style='flex:1; background:" . ($resConU ? '#ecfdf5' : '#fef2f2') . "; border:1px solid " . ($resConU ? '#a7f3d0' : '#fecaca') . "; padding:10px; border-radius:6px;'>";
echo "    <strong>Con /u (/^\\w+$/u):</strong><br><span style='color:" . ($resConU ? '#059669' : '#dc2626') . "; font-weight:bold;'>" . ($resConU ? '✅ Coincide correctamente' : 'Falla') . "</span>";
echo "  </div>";
echo "</div>";

// Caso B: El modificador /s (Dotall) abarcando saltos de línea
$textoMultilinea = "/* COMENTARIO\n   EN MÚLTIPLES\n   LÍNEAS */";

$patronSinS = '/\/\*.*?\*\//';
$patronConS = '/\/\*.*?\*\//s';

echo "<h3 style='color:#0f172a;'>📄 Caso 2: Bloques Multilínea con /s (Dotall)</h3>";
$resConS = preg_match($patronConS, $textoMultilinea, $mConS) === 1;

echo "<div style='background:#f8fafc; border:1px solid #cbd5e1; padding:12px; border-radius:6px;'>";
echo "  <strong>Con modificador /s:</strong> El punto (.) atraviesa saltos de línea y capturó:<br>";
echo "  <pre style='background:#1e293b; color:#38bdf8; padding:8px; border-radius:4px; margin:6px 0; font-size:12px;'>" . htmlspecialchars($mConS[0] ?? '') . "</pre>";
echo "</div>";

echo "</div>";
Pruébalo tú mismo » Se abre en una nueva pestaña con ejecución en vivo
🧠
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección
1 Pregunta
Pregunta 1
¿Qué modificador de patrón es imprescindible en PHP al trabajar con textos que contienen tildes, letras como la "ñ" o emojis para tratarlos como caracteres UTF-8 de múltiples bytes?
🦉
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.

🚀 ¿Quieres dominar Regex en PHP: Expresiones Regulares & PCRE y crear proyectos reales?

Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.

🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.