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.
Расширенные примеры
$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] => ????
$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] => анализа
)
$longText = 'Очень длинная строка, которую нужно разбить на части по 10 символов.';
$parts = mb_str_split($longText, 10);
echo implode("\n", $parts);Очень длин
ная строк
а, котору
ю нужно р
азбить на
части по
10 символ
ов.
Альтернативы в других языках
Для разбиения строки на символы используется преобразование в список. Для подстрок фиксированной длины - списковое включение.
s = 'Привет мир!'
print(list(s)) # На символы
n = 3
print([s[i:i+n] for i in range(0, len(s), n)]) # Подстроки длины 3['П', 'р', 'и', 'в', 'е', 'т', ' ', 'м', 'и', 'р', '!']
['При', 'вет', ' ми', 'р!']
Метод split с пустым разделителем или Array.from для корректной работы с суррогатными парами.
let str = 'Привет мир!';
console.log(str.split('')); // На символы (может быть проблемы с эмодзи)
console.log(Array.from(str)); // Более надежно для Unicode[ 'П', 'р', 'и', 'в', 'е', 'т', ' ', 'м', 'и', 'р', '!' ]
[ 'П', 'р', 'и', 'в', 'е', 'т', ' ', 'м', 'и', 'р', '!' ]
Прямого аналога нет. Для извлечения символов можно использовать SUBSTRING в сочетании с рекурсивными запросами или функциями для работы с JSON.