1

Strtok: примеры (PHP)

Функция strtok для разделения строк в PHP
Раздел: Работа со строками
strtok(string string, string token): string|false
Функция strtok в PHP

Функция strtok выполняет разделение строки на части (токены) с использованием указанных разделителей. Она применяется для последовательной обработки строки по частям, что полезно при разборе текстовых данных.

Использование функции происходит в два этапа: первый вызов с исходной строкой и разделителями, последующие вызовы только с разделителями для получения следующих токенов.

Аргументы функции

string - строка для разбиения. В первом вызове передается исходная строка, в последующих - только разделители.

delimiters - набор символов-разделителей. При каждом вызове можно изменять набор разделителей.

Основные примеры использования
Простое разделение строки
$string = "Это пример строки";
$delimiters = " ";
$token = strtok($string, $delimiters);
while ($token !== false) {
    echo $token . "\n";
    $token = strtok($delimiters);
}
Это
пример
строки
Использование нескольких разделителей
$string = "test@example.com;user.name";
$token = strtok($string, ";@.");
while ($token !== false) {
    echo $token . "\n";
    $token = strtok(";@.");
}
test
example
com
user
name
Изменение разделителей в процессе
$string = "apple,banana;cherry|orange";
$token = strtok($string, ",;");
echo $token . "\n";
$token = strtok("|");
echo $token . "\n";
$token = strtok(",;");
while ($token !== false) {
    echo $token . "\n";
    $token = strtok(",;");
}
apple
banana
cherry
orange
Похожие функции в PHP

Функция explode разделяет строку по указанному разделителю и возвращает массив всех частей. Отличие от strtok в том, что explode возвращает сразу все части, что удобно для небольших строк или когда необходимо получить все элементы одновременно.

preg_split()

Функция preg_split позволяет использовать регулярные выражения для разделения строки. Подходит для сложных случаев, когда разделители имеют сложный шаблон или когда требуется более гибкое разбиение.

Функция str_getcsv предназначена для разбора строк в формате CSV с учетом кавычек и экранирования. Используется при работе с данными в формате таблиц.

Распространенные ошибки
Неправильная инициализация

Повторная передача строки в последующих вызовах приводит к сбросу внутреннего указателя.

$string = "один два три";
$token = strtok($string, " ");
echo $token . "\n";
$token = strtok($string, " "); // Ошибка: сброс указателя
echo $token . "\n";
один
один
Обработка пустых токенов

Если в строке идут несколько разделителей подряд, strtok пропускает пустые токены, что может быть неожиданным.

$string = "яблоко,,апельсин,,";
$token = strtok($string, ",");
while ($token !== false) {
    echo "Токен: '$token'\n";
    $token = strtok(",");
}
Токен: 'яблоко'
Токен: 'апельсин'
Использование false как разделителя

Передача false или некорректного значения в качестве разделителей вызывает ошибку.

$token = strtok("строка", false);
echo $token;
Warning: strtok() expects parameter 2 to be string, bool given
Изменения в версиях PHP

В PHP 8.0 функция strtok стала выбрасывать TypeError при передаче аргументов неправильного типа. Ранее в таких случаях возникали предупреждения.

В PHP 7.3 добавлено уведомление при вызове strtok с одним аргументом, что является устаревшим использованием. Рекомендуется всегда указывать разделители.

Расширенные примеры
Обработка многострочного текста
Пример php
$text = "Строка 1\nСтрока 2\nСтрока 3";
$token = strtok($text, "\n\r");
while ($token !== false) {
    echo "Строка: $token\n";
    $token = strtok("\n\r");
}
Строка: Строка 1
Строка: Строка 2
Строка: Строка 3
Комбинированное разбиение с разными разделителями
Пример php
$data = "name=John&age=30&city=London";
$pairs = [];
$token = strtok($data, "&");
while ($token !== false) {
    $key = strtok($token, "=");
    $value = strtok("");
    $pairs[$key] = $value;
    $token = strtok("&");
}
print_r($pairs);
Array
(
    [name] => John
    [age] => 30
    [city] => London
)
Итерация с сохранением позиции
Пример php
function tokenize($string, $delimiters) {
    static $original, $position;
    if ($string !== null) {
        $original = $string;
        $position = 0;
        return strtok($string, $delimiters);
    }
    if ($original === null) return false;
    return strtok($delimiters);
}

echo tokenize("раз два три", " ") . "\n";
echo tokenize(null, " ") . "\n";
echo tokenize(null, " ") . "\n";
раз
два
три
Аналоги в других языках

Strtok в Python

В Python для аналогичных задач используется метод split() строкового типа или функция split() модуля re для регулярных выражений.

text = "apple,banana;cherry"
import re
result = re.split('[,;]', text)
print(result)
['apple', 'banana', 'cherry']

Strtok в Javascript

В JavaScript применяется метод split() строкового объекта, который работает аналогично explode в PHP.

let text = "apple,banana;cherry";
let result = text.split(/[,;]/);
console.log(result);
['apple', 'banana', 'cherry']

Strtok в MySQL

В MySQL функция SUBSTRING_INDEX позволяет извлекать подстроки по разделителю, но не разбивает строку на все части сразу.

SELECT SUBSTRING_INDEX('www.example.com', '.', 2);
www.example

PHP strtok function comments

En
Strtok Tokenize string