Expresiones regulares en PHP: preg_match con CSV

Clase 23 de 29Curso de Expresiones Regulares

Resumen

PHP sigue siendo clave en la web moderna: WordPress y Drupal lo usan a diario. Aquí verás, paso a paso, cómo leer un CSV y aplicar expresiones regulares con preg_match para filtrar por enero de 2018, contar coincidencias y extraer grupos útiles sin complicaciones.

¿Cómo procesar un CSV en PHP con fopen y fgets?

Abrir y recorrer archivos en PHP es directo. La secuencia correcta asegura que cada línea se lea y se cierre el recurso sin fugas. Un error típico al programar en vivo fue usar un punto en lugar de una coma en los parámetros, lo que rompió fopen; corregido, se confirmó la lectura de 39,009 líneas, útil para validar que el iterador funciona de punta a punta.

  • Usa fopen en modo de solo lectura para abrir el archivo CSV.
  • Itera con while y la comprobación de fin de archivo con feof.
  • Obtén cada línea con fgets y verifica en pantalla con echo.
  • Cierra el recurso con fclose para liberar memoria.
<?php
$file = fopen('files/results.csv', 'r');
while (!feof($file)) {
    $line = fgets($file);
    echo $line;
}
fclose($file);
?>

Habilidades practicadas: lectura de archivos, uso de iteradores, depuración de errores de sintaxis, verificación de conteo de líneas.

¿Qué hace preg_match en PHP con expresiones regulares?

preg_match devuelve un booleano: true cuando hay match y false cuando no. Además, permite pasar por referencia un arreglo que captura la coincidencia completa y cada grupo definido. Para evitar escapes innecesarios, se prefieren comillas simples en el patrón.

  • Delimitadores: usa barras /.../ para la expresión.
  • Anclas: ^ y $ definen inicio y fin de línea.
  • Comodín: el punto-asterisco ., el wild card*, permite “lo que sea” al final.
  • Arreglo de resultados: $m[0] guarda la coincidencia completa; los grupos inician en $m[1].
<?php
$match = 0;
$no_match = 0;

if (preg_match('/^2018\-01\-.*$/', $line, $m)) {
    $match++;
    print_r($m); // inspecciona coincidencias y grupos.
} else {
    $no_match++;
}

printf("match: %d\nno match: %d\n", $match, $no_match);
?>

Conceptos clave: booleano true/false, grupos de captura, anclaje de línea, comodín .* y necesidad de escapar guiones.

¿Cómo filtrar por fecha 2018-01 con regex en PHP?

Se busca “todos los juegos de enero del 2018”. Un patrón posible ancla el inicio con 2018-01- y suelta la cola con .* para aceptar cualquier contenido posterior sin importar su longitud.

  • Usa ^2018-01- para anclar año y mes.
  • Añade .* para aceptar el resto de la línea.
  • Evita patrones “demasiado estrictos” que no dejen espacio a otros campos.
if (preg_match('/^2018\-01\-.*$/', $line, $m)) {
    // Coincide con cualquier registro de enero 2018.
}

¿Cómo capturar el día y validar con coma?

Cuando el CSV separa campos con comas, puedes capturar el día como primer grupo y confirmar la estructura al buscar la coma inmediatamente después del día.

  • Define un grupo para el día antes de la coma.
  • La coma actúa como marcador de campo siguiente en el CSV.
if (preg_match('/^2018\-01\-(.*),/', $line, $m)) {
    // $m[1] corresponde al día capturado antes de la coma.
}

¿Cómo contar matches y depurar errores comunes?

Contar matches y no matches te da una estadística rápida de cobertura del filtro. Un bug frecuente está en la invocación del script o redirecciones del standard output que confunden el conteo de líneas con el de coincidencias.

  • Inicializa contadores $match y $no_match.
  • Incrementa según el resultado de preg_match.
  • Usa printf para un reporte claro y con saltos de línea.
printf("match: %d\nno match: %d\n", $match, $no_match);

¿Qué resultados y datos se observaron al ejecutar el filtro?

El patrón para enero de 2018 arrojó 64 coincidencias. Al imprimir el arreglo de matches, se vio que $m[0] contiene la línea completa evaluada y $m[1] el primer grupo, en este caso el día. Este comportamiento es consistente con PHP y lenguajes afines como Perl y Python.

  • 64 coincidencias para enero 2018.
  • Ejemplo de línea: 2018-01-02, Omán vs Bahrein, 1-0, amistoso.
  • $m[0]: cadena completa que coincidió.
  • $m[1]: día del partido capturado por el primer grupo.

Idea central: lo más importante es diseñar una expresión regular válida que refleje el formato de la línea completa; el código PHP alrededor es breve y directo.

¿Tienes otra estructura de CSV o un patrón de fecha distinto? Comparte tu formato y afinamos la expresión regular juntos.

      Expresiones regulares en PHP: preg_match con CSV