preg_split() en PHP: dividir cadenas con patrones complejos

preg_split() divide una cadena usando un patrón de expresión regular como delimitador, lo que la convierte en la opción adecuada cuando explode() se queda corta por no poder manejar separadores variables o complejos.

Sintaxis básica

<?php
// Dividir por uno o más espacios en blanco
$linea   = "PHP   Python   JavaScript   Rust";
$partes  = preg_split('/s+/', $linea);
print_r($partes);
// ['PHP', 'Python', 'JavaScript', 'Rust']

// Dividir por coma, punto y coma o pipe
$csv   = "manzana,pera;naranja|limón";
$frutas = preg_split('/[,;|]/', $csv);
print_r($frutas);
// ['manzana', 'pera', 'naranja', 'limón']
?>

PREG_SPLIT_NO_EMPTY: eliminar partes vacías

Cuando hay varios delimitadores consecutivos o el delimitador aparece al principio o al final, se generan elementos vacíos. PREG_SPLIT_NO_EMPTY los elimina automáticamente:

<?php
$texto  = ",manzana,,pera,,,naranja,";
$sin    = preg_split('/,/', $texto);
print_r($sin);
// ['', 'manzana', '', 'pera', '', '', 'naranja', '']  ? elementos vacíos

$limpio = preg_split('/,/', $texto, -1, PREG_SPLIT_NO_EMPTY);
print_r($limpio);
// ['manzana', 'pera', 'naranja']  ? sin vacíos

// Útil para tokenizar texto
$tokens = preg_split('/s+/', "  hola   mundo  ", -1, PREG_SPLIT_NO_EMPTY);
print_r($tokens);
// ['hola', 'mundo']
?>

PREG_SPLIT_DELIM_CAPTURE: incluir el delimitador

Con PREG_SPLIT_DELIM_CAPTURE, los grupos capturados del patrón delimitador también se incluyen en el resultado:

<?php
// Dividir por puntuación y conservarla
$frase   = "Hola, mundo. ¿Cómo estás? ¡Bien!";
$partes  = preg_split('/([,.?!¿¡]+)/', $frase, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($partes);
// ['Hola', ',', ' mundo', '.', ' ¿Cómo estás', '?', ' ¡Bien', '!']

// Útil para tokenizadores que necesitan preservar el delimitador
$codigo = "x = 10 + y * 3";
$tokens = preg_split('/(s+|[+*=])/', $codigo, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($tokens);
// ['x', ' ', '=', ' ', '10', ' ', '+', ' ', 'y', ' ', '*', ' ', '3']
?>

El tercer parámetro: límite de partes

<?php
$texto = "uno:dos:tres:cuatro:cinco";

// Sin límite (o -1): todas las partes
print_r(preg_split('/:/', $texto));
// ['uno', 'dos', 'tres', 'cuatro', 'cinco']

// Límite 3: máximo 3 partes; el resto va en el último elemento
print_r(preg_split('/:/', $texto, 3));
// ['uno', 'dos', 'tres:cuatro:cinco']
?>

Cuándo usar preg_split() y cuándo no

La elección entre preg_split(), explode() y str_split() depende del caso:

Función

Úsala cuando...

explode()

El delimitador es una cadena fija (más rápida que regex).

preg_split()

El delimitador es variable, puede ser múltiple o necesitas un patrón.

str_split()

Quieres dividir en trozos de N bytes (no trabaja por caracteres Unicode).

mb_str_split()

Dividir en trozos de N caracteres UTF-8.

<?php
// explode(): delimitador fijo ? más rápido
$partes = explode(',', 'a,b,c,d');

// preg_split(): varios delimitadores posibles ? usa regex
$partes = preg_split('/[,;|t]/', 'a,b;c|d');

// str_split(): trozos de N bytes
$bloques = str_split('abcdef', 2); // ['ab', 'cd', 'ef']

// mb_str_split(): trozos de N caracteres UTF-8
$letras = mb_str_split('café', 1); // ['c', 'a', 'f', 'é']
?>

Casos reales con preg_split()

<?php
// Parsear una cabecera Accept de HTTP
$accept = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$tipos  = preg_split('/s*,s*/', $accept, -1, PREG_SPLIT_NO_EMPTY);
// ['text/html', 'application/xhtml+xml', 'application/xml;q=0.9', '*/*;q=0.8']

// Dividir un texto en oraciones
$texto    = "Primera oración. Segunda oración! ¿Tercera? Cuarta.";
$oraciones = preg_split('/(?<=[.!?])s+/', $texto, -1, PREG_SPLIT_NO_EMPTY);
// ['Primera oración.', 'Segunda oración!', '¿Tercera?', 'Cuarta.']

// Tokenizar números y palabras de una expresión
$expr   = "precio * 1.21 + descuento";
$tokens = preg_split('/(s+|[+-*/])/', $expr, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
?>

La documentación oficial de preg_split() incluye la referencia completa de flags y el comportamiento con límites negativos.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP