preg_split
En PHP, preg_split() divide una cadena en un array de subcadenas usando expresiones regulares como delimitadores.
Introducción
preg_split() divide una cadena en un array de subcadenas utilizando una
expresión regular para describir el delimitador. Es la versión con soporte de
expresiones regulares de explode(): mientras que explode()
solo puede dividir por una cadena fija, preg_split() puede dividir por un
patrón — cualquier secuencia de espacios en blanco, uno de varios caracteres de
puntuación, un límite numérico, y mucho más.
Esta página cubre la firma de la función, cada flag, el valor de retorno y los patrones prácticos (y errores comunes) que encontrarás al usarla en código real.
Sintaxis
preg_split(
string $pattern,
string $subject,
int $limit = -1,
int $flags = 0
): array|false| Parámetro | Descripción |
|---|---|
$pattern | El delimitador como expresión regular, incluyendo los delimitadores como /.../. |
$subject | La cadena de entrada a dividir. |
$limit | Número máximo de partes. -1 (el valor predeterminado) o 0 significa sin límite. Cuando se establece, la última parte contiene el resto sin dividir. |
$flags | Máscara de bits de las constantes PREG_SPLIT_* (ver más abajo). Se combinan con ` |
La función devuelve un array de subcadenas en caso de éxito, o false si el
patrón no es válido. Nunca lanza excepciones — comprueba si devuelve false (y
consulta preg_last_error()) si una división puede fallar.
Un ejemplo básico
Un caso de uso clásico es dividir una cadena por un delimitador variable — aquí, cualquier secuencia de espacios en blanco o comas:
El patrón [\s,]+ coincide con uno o más caracteres de espacio en blanco o
comas, por lo que tanto los espacios como la coma actúan como delimitadores:
Array
(
[0] => This
[1] => is
[2] => a
[3] => test
[4] => string
)Dado que + es codicioso, los delimitadores consecutivos (una coma y un espacio)
se combinan en un único punto de división en lugar de producir elementos vacíos.
Los flags
PREG_SPLIT_NO_EMPTY
Sin este flag, un delimitador al inicio o al final de la cadena — o dos
delimitadores seguidos que el patrón no puede fusionar — produce cadenas vacías en
el resultado. PREG_SPLIT_NO_EMPTY las elimina:
<?php
$string = ',apple,,banana,';
// Without the flag: empty pieces appear.
print_r(preg_split('/,/', $string));
// With the flag: only real values remain.
print_r(preg_split('/,/', $string, -1, PREG_SPLIT_NO_EMPTY));La primera llamada devuelve ['', 'apple', '', 'banana', '']; la segunda devuelve
['apple', 'banana'].
PREG_SPLIT_DELIM_CAPTURE
Si el patrón contiene grupos de captura, este flag incluye el texto capturado en el resultado — útil cuando quieres conservar los delimitadores en lugar de descartarlos:
<?php
$expression = '3+5*2-9';
$tokens = preg_split('/([+\-*\/])/', $expression, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($tokens);El resultado conserva tanto los números como los operadores:
['3', '+', '5', '*', '2', '-', '9'] — exactamente lo que necesita un pequeño
tokenizador de expresiones.
PREG_SPLIT_OFFSET_CAPTURE
Cada elemento se convierte en un par [$substring, $offset], donde $offset es
la posición en bytes dentro de la cadena original. Muy útil cuando necesitas saber
de dónde proviene cada parte.
Limitar el número de divisiones
$limit limita cuántas partes se devuelven; el último elemento conserva el resto
de la cadena sin dividir. Esta es la forma idiomática de dividir "los primeros N
campos y luego todo lo demás":
<?php
$logLine = 'ERROR 2024-01-01 Something broke: details here';
// Split into at most 3 parts on whitespace.
$parts = preg_split('/\s+/', $logLine, 3);
print_r($parts);Esto produce ['ERROR', '2024-01-01', 'Something broke: details here'] — el
tercer elemento conserva sus espacios internos porque se alcanzó el límite.
preg_split() vs explode()
Usa explode() cuando el delimitador sea una cadena fija
— es más rápido y claro. Usa preg_split() cuando el delimitador sea un
patrón: espacios en blanco variables, una elección de caracteres, coincidencia
sin distinción de mayúsculas, o cuando necesites conservar los delimitadores
mediante PREG_SPLIT_DELIM_CAPTURE. Para volver a unir un array en una cadena,
usa implode().
Errores comunes
- Olvidar los delimitadores del patrón. El primer argumento es una expresión
regular completa, por lo que necesita delimitadores:
'/,/', no','. Pasar una cadena sin delimitadores es el error más común entre principiantes. - Caracteres especiales sin escapar. Caracteres como
.,+,|y*son metacaracteres de expresiones regulares. Para dividir por un punto literal, escápalo ('/\./') o usapreg_quote()con entradas dinámicas. - Cadenas vacías inesperadas. Los delimitadores al inicio o al final crean
elementos vacíos — agrega
PREG_SPLIT_NO_EMPTYsi no los quieres.
Funciones relacionadas
explode()— divide por un delimitador de cadena fija.implode()— une un array de nuevo en una cadena.preg_match()/preg_match_all()— busca coincidencias en lugar de dividir.preg_replace()— reemplaza texto mediante un patrón.