Strtok: примеры (PHP)
strtok(string string, string token): string|falseФункция 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
Функция explode разделяет строку по указанному разделителю и возвращает массив всех частей. Отличие от strtok в том, что explode возвращает сразу все части, что удобно для небольших строк или когда необходимо получить все элементы одновременно.
Функция 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 или некорректного значения в качестве разделителей вызывает ошибку.
$token = strtok("строка", false);
echo $token;Warning: strtok() expects parameter 2 to be string, bool given
В PHP 8.0 функция strtok стала выбрасывать TypeError при передаче аргументов неправильного типа. Ранее в таких случаях возникали предупреждения.
В PHP 7.3 добавлено уведомление при вызове strtok с одним аргументом, что является устаревшим использованием. Рекомендуется всегда указывать разделители.
$text = "Строка 1\nСтрока 2\nСтрока 3";
$token = strtok($text, "\n\r");
while ($token !== false) {
echo "Строка: $token\n";
$token = strtok("\n\r");
}Строка: Строка 1 Строка: Строка 2 Строка: Строка 3
$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
)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