Leccion 61 de 75 12 min de lectura

Expresiones Regulares

Las expresiones regulares (regex) permiten buscar y manipular texto usando patrones. Son utiles para validar formatos, extraer datos y hacer reemplazos complejos.

Sintaxis basica

En PHP, los patrones regex van entre delimitadores (normalmente /):

PHP
<?php

declare(strict_types=1);

// Patron: /texto/
// Busca literalmente "texto"

$patron = '/hola/';
$texto = 'Hola mundo, hola a todos';

// preg_match busca la primera coincidencia
if (preg_match($patron, $texto)) {
    echo 'Encontrado';
}

// Con modificador i = insensible a mayusculas
$patron = '/hola/i';
if (preg_match($patron, $texto)) {
    echo 'Encontrado (ignorando mayusculas)';
}

Metacaracteres básicos

PHP
<?php

declare(strict_types=1);

// .  = cualquier caracter (excepto salto de linea)
// ^  = inicio del texto
// $  = fin del texto
// \d = digito (0-9)
// \w = letra, digito o guion bajo
// \s = espacio en blanco

$texto = 'Mi codigo es ABC123';

// Buscar 3 letras seguidas de 3 numeros
if (preg_match('/[A-Z]{3}\d{3}/', $texto)) {
    echo 'Codigo encontrado';
}

// Verificar que empieza con "Mi"
if (preg_match('/^Mi/', $texto)) {
    echo 'Empieza con Mi';
}

// Verificar que termina con numeros
if (preg_match('/\d+$/', $texto)) {
    echo 'Termina con numeros';
}

Cuantificadores

PHP
<?php

declare(strict_types=1);

// *     = 0 o mas veces
// +     = 1 o mas veces
// ?     = 0 o 1 vez
// {n}   = exactamente n veces
// {n,}  = n o mas veces
// {n,m} = entre n y m veces

// Telefono: 9 digitos
$telefono = '612345678';
if (preg_match('/^\d{9}$/', $telefono)) {
    echo 'Telefono valido';
}

// Codigo postal: 5 digitos
$cp = '28001';
if (preg_match('/^\d{5}$/', $cp)) {
    echo 'Codigo postal valido';
}

// DNI: 8 digitos + 1 letra
$dni = '12345678A';
if (preg_match('/^\d{8}[A-Z]$/', $dni)) {
    echo 'DNI valido';
}

Grupos y alternativas

PHP
<?php

declare(strict_types=1);

// () = grupo
// |  = alternativa (OR)
// [] = conjunto de caracteres

// Dominio .com o .es
$email = 'usuario@ejemplo.com';
if (preg_match('/@.+\.(com|es)$/', $email)) {
    echo 'Email .com o .es';
}

// Protocolo http o https
$url = 'https://ejemplo.com';
if (preg_match('/^https?:\/\//', $url)) {
    echo 'URL valida';
}

// Solo vocales
if (preg_match('/^[aeiou]+$/i', 'aeiou')) {
    echo 'Solo vocales';
}

Extraer coincidencias

PHP
<?php

declare(strict_types=1);

$texto = 'Mi email es ana@ejemplo.com';

// Extraer email con grupos
if (preg_match('/(\w+)@(\w+)\.(\w+)/', $texto, $matches)) {
    echo $matches[0]; // ana@ejemplo.com (coincidencia completa)
    echo $matches[1]; // ana (primer grupo)
    echo $matches[2]; // ejemplo (segundo grupo)
    echo $matches[3]; // com (tercer grupo)
}

// Extraer TODAS las coincidencias
$texto = 'Telefonos: 612345678 y 698765432';
preg_match_all('/\d{9}/', $texto, $matches);

foreach ($matches[0] as $telefono) {
    echo $telefono . PHP_EOL;
}
// 612345678
// 698765432

Reemplazar texto

PHP
<?php

declare(strict_types=1);

// Reemplazo simple
$texto = 'Hola mundo';
$resultado = preg_replace('/mundo/', 'PHP', $texto);
echo $resultado; // Hola PHP

// Eliminar espacios multiples
$texto = 'Hola    mundo   PHP';
$limpio = preg_replace('/\s+/', ' ', $texto);
echo $limpio; // Hola mundo PHP

// Ocultar numeros de telefono
$texto = 'Llamar al 612345678';
$oculto = preg_replace('/(\d{3})\d{3}(\d{3})/', '$1***$2', $texto);
echo $oculto; // Llamar al 612***678

// Usar grupos en reemplazo
$fecha = '2024-12-15';
$formateada = preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3/$2/$1', $fecha);
echo $formateada; // 15/12/2024

Patrones comunes

PHP
<?php

declare(strict_types=1);

// Email basico
$emailPattern = '/^[\w\.-]+@[\w\.-]+\.\w+$/';

// Telefono español (9 digitos, empieza por 6, 7 o 9)
$telefonoPattern = '/^[679]\d{8}$/';

// URL
$urlPattern = '/^https?:\/\/[\w\.-]+\.\w+/';

// Solo letras y espacios
$nombrePattern = '/^[a-zA-ZáéíóúüñÁÉÍÓÚÜÑ\s]+$/';

// Contrasena: minimo 8 caracteres, 1 mayuscula, 1 minuscula, 1 numero
$passwordPattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/';

// Ejemplos de uso
$email = 'usuario@ejemplo.com';
if (preg_match($emailPattern, $email)) {
    echo 'Email valido';
}

$telefono = '612345678';
if (preg_match($telefonoPattern, $telefono)) {
    echo 'Telefono valido';
}

Dividir texto

PHP
<?php

declare(strict_types=1);

// Dividir por espacios multiples
$texto = 'Hola    mundo   PHP';
$palabras = preg_split('/\s+/', $texto);
print_r($palabras); // ['Hola', 'mundo', 'PHP']

// Dividir por varios separadores
$datos = 'uno,dos;tres:cuatro';
$partes = preg_split('/[,;:]/', $datos);
print_r($partes); // ['uno', 'dos', 'tres', 'cuatro']

// Dividir manteniendo delimitadores
$texto = 'Hola. Mundo! Como estas?';
$oraciones = preg_split('/([.!?])/', $texto, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($oraciones);

Ejercicios

Ejercicio 1: Validar telefono

Crea una funcion esTelefonoValido(string $telefono): bool que valide telefonos españoles (9 digitos, empieza por 6, 7 o 9).

Ver solucion
PHP
<?php

declare(strict_types=1);

function esTelefonoValido(string $telefono): bool
{
    return preg_match('/^[679]\d{8}$/', $telefono) === 1;
}

var_dump(esTelefonoValido('612345678')); // true
var_dump(esTelefonoValido('512345678')); // false

Ejercicio 2: Extraer hashtags

Crea una funcion extraerHashtags(string $texto): array que extraiga todos los hashtags de un texto.

Ver solucion
PHP
<?php

declare(strict_types=1);

function extraerHashtags(string $texto): array
{
    preg_match_all('/#\w+/', $texto, $matches);
    return $matches[0];
}

$texto = 'Me encanta #PHP y #programacion';
print_r(extraerHashtags($texto));
// ['#PHP', '#programacion']

Ejercicio 3: Limpiar espacios

Crea una funcion limpiarEspacios(string $texto): string que reemplace multiples espacios por uno solo y elimine espacios al inicio y final.

Ver solucion
PHP
<?php

declare(strict_types=1);

function limpiarEspacios(string $texto): string
{
    $limpio = preg_replace('/\s+/', ' ', $texto);
    return trim($limpio);
}

$texto = '  Hola    mundo   ';
echo limpiarEspacios($texto); // 'Hola mundo'

¿Te está gustando el curso?

Tenemos cursos premium con proyectos reales y soporte personalizado.

Descubrir cursos premium