Tema 4 · Clases

Clases de Caracteres, Rangos ([a-z]) y Clases Abreviadas (\d, \w, \s)

Define conjuntos de caracteres válidos con corchetes [...], rangos alfanuméricos, negación [^...] y atajos esenciales (\d dígitos, \w alfanumérico, \s espacios).

¿Qué es una Clase de Caracteres [...]?

Una clase de caracteres (también llamada conjunto de caracteres) se define envolviendo una lista de caracteres entre corchetes [...]. Le indica al motor PCRE que coincida con exactamente un único carácter de entre todos los permitidos dentro del conjunto.

Por ejemplo, el patrón /c[ao]sa/ coincidirá con "casa" o con "cosa", pero nunca con "cesa" ni con "caosa".

Rangos Alfanuméricos y Negación

Para evitar tener que escribir todos los caracteres uno por uno, el guion - dentro de los corchetes define un rango según la tabla ASCII:

  • [a-z]: Cualquier letra minúscula del alfabeto inglés (a la z).
  • [A-Z]: Cualquier letra mayúscula (A la Z).
  • [0-9]: Cualquier dígito del 0 al 9.
  • [a-zA-Z0-9_-]: Cualquier carácter alfanumérico más guion y guion bajo.

La Negación con ^ (Caret)

Cuando el símbolo ^ se coloca inmediatamente después del corchete de apertura (ej: [^abc]), invierte el significado: coincide con cualquier carácter que NO esté en la lista.

// Coincide con cualquier carácter excepto dígitos numéricos:
$patron = '/[^0-9]/';

Clases Abreviadas Predefinidas (Shorthands)

PCRE proporciona atajos sumamente comunes para las clases más utilizadas en el desarrollo backend:

Atajo Equivalente Manual Descripción Negación Inversa
\d [0-9] Cualquier dígito numérico (0-9). \D : Cualquier carácter que no sea dígito.
\w [a-zA-Z0-9_] Carácter de palabra (letras, números y guion bajo). \W : Carácter que no es de palabra (puntuación, espacios).
\s [ \t\r\n\f] Cualquier tipo de espacio en blanco (espacio, tabulador, salto de línea). \S : Cualquier carácter que no sea espacio en blanco.

⚡ Validador de Nombres de Usuario con Clases y Shorthands

Ejemplo interactivo. Validamos que los nombres de usuario solo contengan caracteres alfanuméricos y guiones bajos (3 a 16 caracteres), usando clases y \w:

validador_username.php
Solo lectura
<?php
// Regla: 3 a 16 caracteres, solo letras, números y guion bajo (\w)
// Iniciando con letra obligatoria [a-zA-Z]
$patronUsername = '/^[a-zA-Z]\w{2,15}$/';

$pruebas = [
    'carlos_dev',      // Válido (10 caracteres, letras y guion bajo)
    'valeria2026',     // Válido (11 caracteres)
    'a_b',             // Válido (3 caracteres exactos)
    '99problemas',     // Inválido (no inicia con letra)
    'juan perez',      // Inválido (contiene espacio)
    'super_califragilistico_espialidoso', // Inválido (supera 16 caracteres)
    'dev@kilopolis',   // Inválido (contiene arroba)
];

echo "<div style='font-family:system-ui; max-width:620px; padding:15px;'>";
echo "<h3 style='color:#0f172a; margin-top:0;'>👤 Validador de Usernames con \\w</h3>";
echo "<p style='color:#64748b; font-size:13px;'>Patrón: <code>^[a-zA-Z]\\w{2,15}$</code> (inicia con letra + caracteres de palabra)</p>";

foreach ($pruebas as $username) {
    $esValido = preg_match($patronUsername, $username) === 1;

    $colorFondo = $esValido ? '#ecfdf5' : '#fef2f2';
    $colorBorde = $esValido ? '#10b981' : '#ef4444';
    $icono = $esValido ? '✅' : '❌';
    $mensaje = $esValido ? 'NOMBRE VÁLIDO' : 'RECHAZADO POR POLÍTICA';

    echo "<div style='display:flex; justify-content:space-between; align-items:center; background:$colorFondo; border:1px solid $colorBorde; border-radius:6px; padding:10px 14px; margin-bottom:8px;'>";
    echo "  <div>";
    echo "    <strong style='font-family:monospace; font-size:15px; color:#1e293b;'>$username</strong>";
    echo "    <span style='color:#64748b; font-size:12px; margin-left:8px;'>(" . strlen($username) . " chars)</span>";
    echo "  </div>";
    echo "  <span style='color:$colorBorde; font-weight:bold; font-size:12px;'>$icono $mensaje</span>";
    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
¿Cuál es la diferencia exacta entre el atajo "\w" y la clase negada "[^0-9]"?
🦉
¿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.