Tema 13 · Arrays

Funciones preg_grep() y preg_filter(): Búsqueda y Filtrado en Colecciones

Filtra y transforma colecciones y arrays masivos directamente con preg_grep() para retener elementos coincidentes y preg_filter() para reemplazar en lote.

Filtrado de Arrays con preg_grep()

En lugar de escribir bucles foreach manuales con preg_match() para filtrar una lista de elementos, PHP ofrece la función especializada preg_grep().

Evalúa cada elemento de un array contra una expresión regular y retorna un nuevo array conservando únicamente los elementos que coinciden con el patrón (preservando además las claves originales).

array preg_grep(string $pattern, array $array, int $flags = 0)

Si pasas la bandera PREG_GREP_INVERT, invierte la lógica: retorna los elementos que NO coinciden con el patrón (ideal para listas negras o detección de anomalías).

Transformación Selectiva con preg_filter()

La función preg_filter() es idéntica a preg_replace(), con una diferencia fundamental: cuando se aplica sobre un array, descarta silenciosamente todos los elementos donde no ocurrió ningún reemplazo.

Retorna un nuevo array que contiene únicamente los elementos transformados, combinando en una sola operación atómica un filtro y un reemplazo.

⚡ Filtrado de Archivos y Normalización Masiva de Teléfonos en PHP

Ejemplo interactivo. Filtramos una lista de archivos para retener imágenes con preg_grep() y normalizamos teléfonos internacionales con preg_filter():

grep_and_filter.php
Solo lectura
<?php
// 1. Filtrado de Archivos con preg_grep()
$archivosSubidos = [
    'foto_perfil.jpg',
    'documento_contrato.pdf',
    'banner_promocional.PNG',
    'script_malicioso.php.exe',
    'icono_app.svg',
    'hoja_calculo.xlsx',
    'logo_empresa.webp'
];

// Patrón para imágenes web seguras (jpg, png, svg, webp)
$patronImagenes = '/\.(jpe?g|png|svg|webp)$/i';
$imagenesValidas = preg_grep($patronImagenes, $archivosSubidos);

echo "<div style='font-family:system-ui; max-width:640px; padding:15px;'>";
echo "<h3 style='color:#0f172a; margin-top:0;'>📁 1. Filtrado con preg_grep()</h3>";
echo "<p style='color:#64748b; font-size:13px;'>Imágenes aprobadas para almacenamiento (" . count($imagenesValidas) . " de " . count($archivosSubidos) . "):</p>";
echo "<div style='display:flex; flex-wrap:wrap; gap:6px; margin-bottom:20px;'>";
foreach ($imagenesValidas as $img) {
    echo "<span style='background:#ecfdf5; border:1px solid #10b981; color:#065f46; font-family:monospace; font-size:12px; font-weight:bold; padding:4px 10px; border-radius:4px;'>🖼️ $img</span>";
}
echo "</div>";

// 2. Transformación Selectiva con preg_filter()
$telefonosSucios = [
    'Ventas: +57 (300) 123-4567',
    'Soporte Técnico: 3109876543',
    'No disponible por el momento',
    'Línea Directa: +1 (800) 555-0199',
    'Pendiente de asignación'
];

// Patrón que detecta números con código de país y los transforma a formato limpio E.164
$patronTel = '/^.*?\+(\d{1,3})\s*\(?(\d{3})\)?[\s-]*(\d{3})[\s-]*(\d{4}).*$/';
$reemplazoE164 = '+$1$2$3$4';

// preg_filter() transforma y descarta automáticamente las entradas que no tengan teléfono
$telefonosNormalizados = preg_filter($patronTel, $reemplazoE164, $telefonosSucios);

echo "<h3 style='color:#0f172a;'>📞 2. Transformación con preg_filter()</h3>";
echo "<p style='color:#64748b; font-size:13px;'>Solo retiene y convierte las líneas que contienen teléfonos válidos:</p>";
echo "<ul style='padding-left:20px; font-size:13px;'>";
foreach ($telefonosNormalizados as $tel) {
    echo "<li style='margin-bottom:4px;'><strong style='color:#0284c7; font-family:monospace; font-size:14px;'>$tel</strong> <span style='color:#10b981;'>(Formato E.164)</span></li>";
}
echo "</ul>";

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
¿En qué se diferencia preg_filter() de preg_replace() cuando se aplica sobre un array de elementos?
🦉
¿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.