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
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
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
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
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
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
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
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
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
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
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
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'
¿Has encontrado un error o tienes una sugerencia para mejorar esta leccion?
Escribenos¿Te está gustando el curso?
Tenemos cursos premium con proyectos reales y soporte personalizado.
Descubrir cursos premium