chunk_split()
Функция chunk_split() разбивает строку на небольшие фрагменты и вставляет разделитель после каждого.
Функция PHP chunk_split() разбивает строку на серию фрагментов одинаковой длины и вставляет разделитель после каждого из них. Она не делит строку на array — она возвращает единую новую строку со встроенными разделителями. Классический сценарий применения — перенос длинных непрерывных данных (например, содержимого в кодировке Base64) на строки фиксированной ширины для передачи по электронной почте или через MIME.
В этой главе рассматриваются синтаксис, все параметры, выполняемые примеры и типичные ошибки, с которыми сталкиваются разработчики.
Синтаксис
chunk_split(string $string, int $length = 76, string $separator = "\r\n"): string| Параметр | Обязателен | По умолчанию | Описание |
|---|---|---|---|
$string | Да | — | Строка, которую нужно разбить на фрагменты. |
$length | Нет | 76 | Длина каждого фрагмента в байтах. Должна быть не менее 1. |
$separator | Нет | "\r\n" | Строка, вставляемая после каждого фрагмента. |
Функция возвращает новую строку. Разделитель добавляется после каждого фрагмента — включая последний, — поэтому результат всегда заканчивается завершающим разделителем.
Значения по умолчанию выбраны не случайно: 76 символов с окончанием строки \r\n (CRLF) — именно то, что рекомендует RFC 2045 для тел сообщений в кодировке MIME.
Базовый пример
Разбиваем строку на фрагменты по 20 символов, используя разделитель \r\n по умолчанию:
Каждые 20 символов chunk_split() вставляет возврат каретки и перевод строки (\r\n). В терминале \r\n отображается как перенос строки, поэтому вывод выглядит следующим образом:
Lorem ipsum dolor si
t amet, consectetur
adipiscing elit. Nul
la at nulla justo, e
get luctus tortor. M
aecenas vel est at m
assa aliquam semper.Обратите внимание, что каждая видимая строка содержит ровно 20 символов исходной строки — функция считает символы, а не слова, поэтому слова могут быть разбиты посередине. Если вам нужен перенос с учётом слов, используйте wordwrap().
Использование пользовательского разделителя
Третий параметр позволяет выбрать, что вставлять после каждого фрагмента. Здесь мы используем одиночный перевод строки ("\n") вместо \r\n по умолчанию:
Результат:
Lorem ipsum dolor si
t amet, consectetur
adipiscing elit. Nul
la at nulla justo, e
get luctus tortor. M
aecenas vel est at m
assa aliquam semper.Разделителем может быть любая строка, а не только перенос строки. При вызове chunk_split("abcdefghij", 4, "-") результат будет abcd-efgh-ij- — обратите внимание на завершающий - после последнего, более короткого фрагмента.
Практический пример: перенос данных Base64
Функция chunk_split() создавалась для работы с электронной почтой. Вывод Base64 представляет собой одну длинную непрерывную строку, однако тела MIME-сообщений должны переноситься каждые 76 символов. Объединение base64_encode() с chunk_split() создаёт текст, готовый к передаче:
<?php
$data = "Hello World, this is a longer string to demonstrate chunk_split for MIME like wrapping of base64 data.";
$encoded = base64_encode($data);
echo chunk_split($encoded, 76, "\n");
?>Это разбивает строку Base64 на строки по 76 символов:
SGVsbG8gV29ybGQsIHRoaXMgaXMgYSBsb25nZXIgc3RyaW5nIHRvIGRlbW9uc3RyYXRlIGNodW5r
X3NwbGl0IGZvciBNSU1FIGxpa2Ugd3JhcHBpbmcgb2YgYmFzZTY0IGRhdGEuНа что обратить внимание
- Завершающий разделитель.
chunk_split()всегда добавляет разделитель и после последнего фрагмента. Если он не нужен, обрежьте его:rtrim(chunk_split($s, 20), "\r\n"). - Функция возвращает string, а не array. Чтобы разбить строку на array фрагментов фиксированной длины, используйте
str_split(). Чтобы разбить строку по разделителю, используйтеexplode(). - Длина измеряется в байтах. При работе с многобайтовым (UTF-8) текстом фрагмент может оказаться в середине многобайтового символа и повредить его.
chunk_split()безопасна только для однобайтовых данных, таких как ASCII или Base64. $lengthдолжна быть положительной. Передача0вызываетValueError(PHP 8+) или предупреждение и возвращаетfalseв более старых версиях.
Связанные функции
wordwrap()— перенос строки по заданной ширине на границах слов.str_split()— разбивает строку на array фрагментов одинаковой длины.explode()— разбивает строку на array с использованием разделителя.nl2br()— вставляет HTML-переносы строк перед символами новой строки.