Tema 9 · Extracción

Función preg_match_all(): Búsqueda Global y Flags de Ordenamiento

Extrae todas las apariciones de un patrón en un texto extenso y domina las banderas PREG_PATTERN_ORDER vs PREG_SET_ORDER para estructurar resultados.

¿Por qué usar preg_match_all()?

Mientras que preg_match() se detiene inmediatamente al encontrar la primera coincidencia, preg_match_all() recorre todo el texto de principio a fin, buscando y recopilando todas y cada una de las ocurrencias que coincidan con la expresión regular.

Devuelve un entero con el número total de coincidencias encontradas (o false si ocurrió un error en el motor).

Estructuración del Array: PREG_PATTERN_ORDER vs PREG_SET_ORDER

Al capturar múltiples grupos en múltiples ocurrencias, el orden en el que PHP organiza el array multidimensional $matches se controla mediante su cuarto parámetro:

Bandera (Flag) Estructura del Array Resultante Cuándo Conviene Usarla
PREG_PATTERN_ORDER
(Por Defecto)
Organizado por columnas (por grupo):
• $matches[0] = Array con todas las coincidencias completas.
• $matches[1] = Array con todos los valores del grupo 1.
• $matches[2] = Array con todos los valores del grupo 2.
Ideal para obtener listas agregadas de un solo campo (ej: una lista con todos los precios o todos los nombres de usuario).
PREG_SET_ORDER Organizado por filas (por elemento encontrado):
• $matches[0] = [Coincidencia 1 completa, Grupo 1, Grupo 2]
• $matches[1] = [Coincidencia 2 completa, Grupo 1, Grupo 2]
Recomendado para iterar con foreach: Trata cada coincidencia como un registro u objeto independiente, facilitando su inserción en bases de datos o conversión a JSON.

⚡ Extracción de Catálogo de Productos con PREG_SET_ORDER

Ejemplo interactivo. Raspamos un fragmento de texto con múltiples productos extrayendo nombre, código SKU y precio unitario:

extraccion_catalogo.php
Solo lectura
<?php
$textoInventario = <<<TEXTO
Listado de Inventario de Tienda:
- Producto: Laptop Gamer Pro [SKU: LAP-1092] Precio: $1,299.99 USD
- Producto: Monitor Curvo 27" [SKU: MON-4421] Precio: $249.50 USD
- Producto: Teclado Mecánico RGB [SKU: TEC-8810] Precio: $89.00 USD
- Producto: Ratón Ergonómico [SKU: RAT-0055] Precio: $35.90 USD
TEXTO;

// Patrón con grupos nombrados para cada atributo
$patron = '/Producto:\s+(?P<nombre>[^\[]+)\s+\[SKU:\s+(?P<sku>[A-Z]{3}-\d{4})\]\s+Precio:\s+\$(?P<precio>[\d,]+\.\d{2})/i';

echo "<div style='font-family:system-ui; max-width:640px; padding:15px;'>";
echo "<h3 style='color:#0f172a; margin-top:0;'>📦 Extracción Global con preg_match_all()</h3>";

// Usamos PREG_SET_ORDER para recibir cada producto como un registro independiente
$totalEncontrados = preg_match_all($patron, $textoInventario, $productos, PREG_SET_ORDER);

echo "<p style='color:#059669; font-weight:bold;'>Total de artículos identificados: $totalEncontrados</p>";

echo "<table style='width:100%; border-collapse:collapse; font-size:13px; text-align:left; background:#ffffff; border:1px solid #e2e8f0; border-radius:6px; overflow:hidden;'>";
echo "  <tr style='background:#f8fafc; border-bottom:1px solid #cbd5e1; color:#475569;'>";
echo "    <th style='padding:8px 12px;'>SKU</th>";
echo "    <th style='padding:8px 12px;'>Nombre del Producto</th>";
echo "    <th style='padding:8px 12px; text-align:right;'>Precio</th>";
echo "  </tr>";

foreach ($productos as $p) {
    echo "  <tr style='border-bottom:1px solid #f1f5f9;'>";
    echo "    <td style='padding:8px 12px; font-family:monospace; color:#0284c7; font-weight:bold;'>{$p['sku']}</td>";
    echo "    <td style='padding:8px 12px; color:#1e293b;'>" . htmlspecialchars(trim($p['nombre'])) . "</td>";
    echo "    <td style='padding:8px 12px; text-align:right; font-weight:bold; color:#059669;'>\${$p['precio']}</td>";
    echo "  </tr>";
}

echo "</table>";
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
¿Por qué la bandera PREG_SET_ORDER es la preferida por los desarrolladores cuando se itera el resultado de preg_match_all() con un bucle foreach?
🦉
¿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.