W3docs

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|false

Hay dos formas de llamarla:

FormaSignificado
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:

  • $delimiter es 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 de explode().
  • La función retorna false cuando no hay más tokens (o si $delimiter está 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 argumento strtok($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
you

Use 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
John

Obtener 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 line

strtok() vs explode()

Ambas dividen cadenas, pero se comportan de manera diferente:

strtok()explode()
Retornaun token por llamadaun array completo de una vez
Delimitadorun conjunto de caracteres individualesuna cadena fija de varios caracteres
Campos vacíosomitidospreservados
Estadocon 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().

Práctica

Práctica
¿Qué hace la función strtok de PHP?
¿Qué hace la función strtok de PHP?
Was this page helpful?