strtok()
La función strtok() en PHP divide una cadena en partes más pequeñas llamadas tokens, usando delimitadores de un solo carácter.
Introducción
La función strtok() en PHP divide una cadena en fragmentos más pequeños llamados tokens. Un token es un trozo de texto entre delimitadores — caracteres individuales como un espacio, una coma o una nueva línea que marcan dónde termina una parte y comienza la siguiente.
Lo que hace a strtok() inusual es que es con estado: recuerda su posición en la cadena entre llamadas. Se lee el primer token, y luego se sigue llamando para obtener el siguiente token, y el siguiente, hasta que se agota la cadena. Esta página cubre la sintaxis, cómo funciona ese puntero interno, los errores comunes y cuándo conviene usar explode() en su lugar.
Sintaxis
strtok(string $string, string $delimiter): string|false
// continuation call:
strtok(string $delimiter): string|falseHay dos formas de llamarla:
| Forma | Significado |
|---|---|
strtok($string, $delimiter) | Inicia la tokenización de $string, retorna el primer token. |
strtok($delimiter) | Continúa desde donde se detuvo la llamada anterior, retorna el siguiente token. |
Puntos clave sobre los parámetros:
$delimiteres un conjunto de caracteres, no un separador de varios caracteres." !?"significa "dividir en un espacio, un signo de exclamación, o un signo de interrogación" — cada carácter es su propio delimitador. No divide en la cadena literal de tres caracteres" !?".- El delimitador puede cambiar entre llamadas, que es la principal razón para usar
strtok()en lugar deexplode(). - La función retorna
falsecuando no hay más tokens (o si$delimiterestá vacío), por lo que puede usarse como condición de bucle.
En PHP 8.1+ la antigua forma de continuación
strtok(null, $delimiter)está obsoleta. Use la forma de un argumentostrtok($delimiter)para continuar.
Ejemplo básico: recorriendo tokens con un bucle
El patrón típico es una llamada para iniciar, y luego un bucle while que sigue obteniendo tokens hasta que strtok() retorna false:
<?php
$string = "Hello World! How are you?";
$delimiter = " !?";
$token = strtok($string, $delimiter); // first token
while ($token !== false) {
echo $token . "\n";
$token = strtok($delimiter); // next token (single-arg form)
}Salida:
Hello
World
How
are
youUse una comparación estricta !== false, no solo while ($token). Un token con valor "0" es falsy en PHP, por lo que una verificación laxa se detendría anticipadamente con datos legítimos.
Los delimitadores consecutivos se omiten
A diferencia de explode(), strtok() trata una secuencia de caracteres delimitadores como un único separador y nunca retorna tokens vacíos:
<?php
$tok = strtok("a,,b", ",");
while ($tok !== false) {
echo "[$tok]\n";
$tok = strtok(",");
}Salida:
[a]
[b]La parte vacía entre las dos comas se descarta silenciosamente. explode(",", "a,,b") en cambio retornaría ["a", "", "b"]. Si preservar campos vacíos es importante (CSV, por ejemplo), no use strtok().
Cambiar el delimitador a mitad del análisis
Dado que el puntero interno se preserva, se pueden cambiar los delimitadores entre llamadas — útil para analizar datos con formato clave=valor:
<?php
$line = "name=John; age=30";
$key = strtok($line, "="); // split on "=" → "name"
$value = strtok(";"); // now split on ";" → " John"
echo trim($key) . "\n";
echo trim($value) . "\n";Salida:
name
JohnObtener solo la primera línea
Un idioma rápido para leer solo la primera línea de una cadena multilínea, sin construir un array con todas las líneas:
<?php
$text = "first line\nsecond line\nthird line";
$firstLine = strtok($text, "\n");
echo $firstLine . "\n";Salida:
first linestrtok() vs explode()
Ambas dividen cadenas, pero se comportan de manera diferente:
strtok() | explode() | |
|---|---|---|
| Retorna | un token por llamada | un array completo de una vez |
| Delimitador | un conjunto de caracteres individuales | una cadena fija de varios caracteres |
| Campos vacíos | omitidos | preservados |
| Estado | con estado (puntero interno) | sin estado |
Para la mayoría del código moderno, explode() es más fácil de razonar y funciona bien con las funciones de array. Use strtok() cuando necesite una lectura perezosa token por token o desee cambiar el delimitador a mitad del proceso. Para datos separados por comas con comillas, prefiera str_getcsv().
Errores comunes
- El puntero interno es global por cadena. Llamar a otra función que use
strtok()en medio de su bucle corromperá su posición. Termine una tokenización antes de iniciar otra. - No pase la cadena fuente nuevamente en la continuación.
strtok($string, $delimiter)reinicia desde el principio cada vez. La continuación debe usar la forma de un solo argumento. - Los campos vacíos desaparecen. Como se mostró anteriormente,
strtok()no puede indicarle que un campo estaba en blanco.
Conclusión
strtok() recorre una cadena un token a la vez, dividiendo por cualquier carácter de un conjunto de delimitadores y manteniendo un puntero interno entre llamadas. Su naturaleza con estado la hace ideal para el análisis perezoso y para cambiar delimitadores a mitad del proceso, mientras que su hábito de descartar campos vacíos la hace inadecuada para datos de columnas fijas. Cuando simplemente necesite todas las partes como un array, explode() suele ser la opción más clara; para dividir en fragmentos de longitud fija, consulte str_split().