PHP strtok Recortando Strings Delimitadas por Caracter

$email = 'user.name@mocked.mail';
$user = strtok($email,'@');
var_dump($user); //user.name

$domain = strtok('');
var_dump($domain); //mocked.mail

Há algum tempo atrás trabalhei em um projeto que lidava com importação de dados e a sanitização era um processo imprescindível. Então me deparei com um comando muito curioso que eu não conhecia até então, o strtok.

Na sanitização de email é bastante factível subdividir a string principal em usuário e domínio, então ao invés de recorrer ao tradicional explode eu parti em busca de um novo recurso, algo mais prático.

Apliquei este comando especialmente em testes unitários combinados com o recurso DataProvider.

Veja como é simples conseguir o primeiro nome e sobrenome em dois hits apenas.

$email = 'first-name.last-name@mocked.mail';
$first = strtok(strtok($email,'@'),'.');
var_dump($first); //first-name

$last = strtok('');
var_dump($last); //last-name

Entenda como strtok realmente funciona. Ao informar o caracter delimitador a tokenização é buferizada e o primeiro elemento é disponibilizado e o restante da string permanece no buffer, mas sem ter sido particionada.

$csv = 'column1;column2;column3;column4;column5';
$first = strtok($csv, ';');
var_dump($first); //column1

$remainder = strtok('');
var_dump($remainder); //column2;column3;column4;column5

Para alcançar todos os elementos na cadeia é necessário ir particionando o conteúdo restante que se encontra no buffer, para isto basta informar apenas o delimitador na tokenização. Observe o código abaixo que demonstra um loop até que o retorno seja (bool)FALSE indicando que não existem mais elementos no buffer;

$csv = 'column1;column2;column3;column4;column5';
$token = strtok($csv, ';');

while ($token !== false) {
  echo $token."\n";
  $token = strtok(';');
}

Observe também que você pode utilizar múltiplos delimitadores no processamento e não há uma ordem que precise ser respeitada. A cada ciclo, ao encontrar qualquer um dos caracteres delimitadores o primeiro elemento é imediatamente retornado e o restante permanece no buffer até que ocorra o exaurimento completo do buffer.

$csv = 'column1;column2-column3|column4/column5';
$token = strtok($csv, '|-/;');

while ($token !== false) {
  echo $token."\n";
  $token = strtok('-|;/');
}

Agora você já sabe, precisou quebrar uma string?

Vai de strtok!