Mb str split: примеры (PHP)

Использование mb_str_split для разбиения строк в PHP
Раздел: Многобайтовые строки
mb_str_split(string $string, int $length = 1, ?string $encoding = null): array

Функция mb_str_split в PHP

Функция mb_str_split разбивает строку, содержащую многобайтовые символы, на массив символов или подстрок заданной длины. Она появилась в PHP 7.4 и предназначена для корректной работы с кодировками, отличными от однобайтовых, например, UTF-8.

Когда используется

Функция применяется, когда требуется посимвольный разбор строк в многобайтовых кодировках или разделение на подстроки фиксированной длины с учётом символов, занимающих несколько байт. Это важно для языков с нелатинской письменностью (русский, китайский, арабский) и для работы с эмодзи.

Аргументы функции
  • string (обязательный) - исходная строка для разбиения.
  • length (необязательный) - максимальная длина каждого элемента возвращаемого массива. По умолчанию равен 1 (разбиение на символы).
  • encoding (необязательный) - кодировка строки. Если не указана, используется внутренняя кодировка скрипта.

Примеры использования mb_str_split

Разбиение строки на отдельные символы
$str = 'Привет мир!';
print_r(mb_str_split($str));
Array
(
[0] => П
[1] => р
[2] => и
[3] => в
[4] => е
[5] => т
[6] =>
[7] => м
[8] => и
[9] => р
[10] => !
)
Разбиение на подстроки заданной длины
$str = 'abcdefghij';
print_r(mb_str_split($str, 3));
Array
(
[0] => abc
[1] => def
[2] => ghi
[3] => j
)
Указание кодировки
$str = 'こんにちは'; // Японское приветствие
print_r(mb_str_split($str, 2, 'UTF-8'));
Array
(
[0] => こん
[1] => にち
[2] => は
)

Похожие функции в PHP

  • str_split - аналог для однобайтовых кодировок. Не корректно работает с многобайтовыми символами, разбивая их на байты.
  • preg_split с модификатором u (UTF-8) - может разбивать строку по шаблону, например, на символы: preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY). Более универсальна, но медленнее для простого разбиения на символы.
  • mb_substr в цикле - позволяет получить подстроки любой длины, но требует написания большего кода.

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

Типичные ошибки

Некорректная кодировка

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

$str = 'Тест';
var_dump(mb_str_split($str, 1, 'ASCII')); // Символы не из ASCII могут быть потеряны
array(4) {
[0]=> string(1) "T"
[1]=> string(1) "e"
[2]=> string(1) "s"
[3]=> string(1) "t"
}
Отрицательная или нулевая длина

Длина должна быть целым положительным числом.

$str = 'Пример';
var_dump(mb_str_split($str, 0));
Warning: mb_str_split(): The length of each segment must be greater than zero

Изменения в PHP

Функция mb_str_split была добавлена в PHP 7.4. В PHP 8.0 и 8.1 значительных изменений в её поведении не было. Все улучшения связаны с общими изменениями в модуле mbstring.

Расширенные примеры

Обработка строк с эмодзи
Пример php
$str = 'Hello????World????';
$chars = mb_str_split($str);
foreach ($chars as $index => $char) {
echo "[$index] => $char\n";
}
[0] => H
[1] => e
[2] => l
[3] => l
[4] => o
[5] => ????
[6] => W
[7] => o
[8] => r
[9] => l
[10] => d
[11] => ????
Разбиение для обработки текста по словам (группировка символов)
Пример php
$text = 'Пример текста для анализа.';
$words = [];
$currentWord = '';
foreach (mb_str_split($text) as $char) {
if ($char === ' ' || $char === '.') {
if ($currentWord !== '') {
$words[] = $currentWord;
$currentWord = '';
}
} else {
$currentWord .= $char;
}
}
print_r($words);
Array
(
[0] => Пример
[1] => текста
[2] => для
[3] => анализа
)
Создание строки с переносами через заданное количество символов
Пример php
$longText = 'Очень длинная строка, которую нужно разбить на части по 10 символов.';
$parts = mb_str_split($longText, 10);
echo implode("\n", $parts);
Очень длин
ная строк
а, котору
ю нужно р
азбить на
части по
10 символ
ов.

Альтернативы в других языках

Python

Для разбиения строки на символы используется преобразование в список. Для подстрок фиксированной длины - списковое включение.

s = 'Привет мир!'
print(list(s)) # На символы
n = 3
print([s[i:i+n] for i in range(0, len(s), n)]) # Подстроки длины 3
['П', 'р', 'и', 'в', 'е', 'т', ' ', 'м', 'и', 'р', '!']
['При', 'вет', ' ми', 'р!']
JavaScript

Метод split с пустым разделителем или Array.from для корректной работы с суррогатными парами.

let str = 'Привет мир!';
console.log(str.split('')); // На символы (может быть проблемы с эмодзи)
console.log(Array.from(str)); // Более надежно для Unicode
[ 'П', 'р', 'и', 'в', 'е', 'т', ' ', 'м', 'и', 'р', '!' ]
[ 'П', 'р', 'и', 'в', 'е', 'т', ' ', 'м', 'и', 'р', '!' ]
MySQL

Прямого аналога нет. Для извлечения символов можно использовать SUBSTRING в сочетании с рекурсивными запросами или функциями для работы с JSON.

PHP mb_str_split function comments

En
Mb str split Split a multibyte string into an array of its characters