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

Многобайтовое разделение строк функцией mb_split
Раздел: Многобайтовые строки
mb_split(string $pattern, string $string, int $limit = -1): array|false
Основные сведения о функции mb_split

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

Когда используется функция

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

Аргументы функции
  • pattern - регулярное выражение для поиска разделителей
  • string - входная строка для разделения
  • limit - максимальное количество элементов в результате (необязательный, по умолчанию -1)
  • encoding - кодировка символов (необязательный)
Базовые примеры использования
Простое разделение по запятой
$str = "яблоко,груша,апельсин,банан";
$result = mb_split(",", $str);
print_r($result);
Array
(
    [0] => яблоко
    [1] => груша
    [2] => апельсин
    [3] => банан
)
Ограничение количества элементов
$str = "один два три четыре пять";
$result = mb_split("\s+", $str, 3);
print_r($result);
Array
(
    [0] => один
    [1] => два
    [2] => три четыре пять
)
Разделение по многобайтовому символу
$str = "слово€разделитель€текст";
$result = mb_split("€", $str);
print_r($result);
Array
(
    [0] => слово
    [1] => разделитель
    [2] => текст
)
Похожие функции в PHP
preg_split

Функция для разделения строк с использованием регулярных выражений. Работает быстрее, но может некорректно обрабатывать многобайтовые строки без модификатора /u.

explode

Разделяет строку по фиксированному разделителю. Более эффективна для простого разделения без регулярных выражений.

str_split

Разбивает строку на массив символов. Не поддерживает многобайтовые строки без mb_str_split.

Когда что использовать

Использование mb_split предпочтительно при работе с многобайтовыми строками и сложными шаблонами разделения. Для ASCII-строк лучше подходит preg_split. Простое разделение по фиксированной строке эффективнее выполнять через explode.

Типичные ошибки
Некорректная кодировка
mb_regex_encoding('ASCII');
$str = "строка с кириллицей";
$result = mb_split("\s+", $str);
print_r($result);
Array
(
    [0] => строка с кириллицей
)
Неверный шаблон регулярного выражения
$str = "текст1;текст2;текст3";
$result = mb_split(";;", $str);
print_r($result);
Array
(
    [0] => текст1;текст2;текст3
)
Использование без установленного расширения mbstring
// При отключенном расширении mbstring
$result = mb_split(",", "a,b,c");
var_dump($result);
NULL
Изменения в новых версиях PHP
PHP 7.3

Улучшена обработка ошибок при неверных кодировках. Добавлены предупреждения при использовании устаревших кодировок.

PHP 8.0

Изменено поведение при передаче null в параметрах. Теперь вызывает TypeError вместо предупреждения. Улучшена производительность.

PHP 8.2

Добавлены предупреждения о устаревших кодировках. Улучшена совместимость с современными стандартами Unicode.

Расширенные примеры
Разделение с сохранением разделителей
Пример php
$str = "100+200-300*400/500";
$result = mb_split('([+\-*/])', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($result);
Array
(
    [0] => 100
    [1] => +
    [2] => 200
    [3] => -
    [4] => 300
    [5] => *
    [6] => 400
    [7] => /
    [8] => 500
)
Обработка текста с разными пробелами
Пример php
$text = "Слово1 Слово2 Слово3"; // Используются полноширинные пробелы
$result = mb_split('[\s ]+', $text);
print_r($result);
Array
(
    [0] => Слово1
    [1] => Слово2
    [2] => Слово3
)
Разделение по нескольким разделителям
Пример php
$data = "Имя:Иван;Возраст:30;Город:Москва";
$pairs = mb_split('[;:]', $data);
print_r($pairs);
Array
(
    [0] => Имя
    [1] => Иван
    [2] => Возраст
    [3] => 30
    [4] => Город
    [5] => Москва
)
Обработка CSV с экранированными запятыми
Пример php
$csv = "значение1,\"значение,с запятой\",значение3";
$result = mb_split(',(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)', $csv);
print_r($result);
Array
(
    [0] => значение1
    [1] => "значение,с запятой"
    [2] => значение3
)
Разделение строки на отдельные символы
Пример php
$text = "Привет";
$chars = mb_split('', $text);
array_shift($chars); // Удаляем пустой первый элемент
print_r($chars);
Array
(
    [0] => П
    [1] => р
    [2] => и
    [3] => в
    [4] => е
    [5] => т
)
Обработка текста с переносами строк
Пример php
$multiline = "Первая строка\nВторая строка\r\nТретья строка\rЧетвертая";
$lines = mb_split("\r\n|\n|\r", $multiline);
print_r($lines);
Array
(
    [0] => Первая строка
    [1] => Вторая строка
    [2] => Третья строка
    [3] => Четвертая
)
Аналоги в других языках
Python: re.split
import re
str = "яблоко,груша,апельсин"
result = re.split(r',', str)
print(result)
['яблоко', 'груша', 'апельсин']
JavaScript: String.prototype.split
let str = "яблоко,груша,апельсин";
let result = str.split(',');
console.log(result);
['яблоко', 'груша', 'апельсин']
MySQL: REGEXP_SUBSTR
SELECT REGEXP_SUBSTR('яблоко,груша,апельсин', '[^,]+', 1, 1) as item1,
       REGEXP_SUBSTR('яблоко,груша,апельсин', '[^,]+', 1, 2) as item2;
item1: яблоко
item2: груша
Основные отличия

Python и JavaScript имеют встроенную поддержку Unicode, поэтому не требуют специальных функций для многобайтовых строк. MySQL использует другой подход с функциями извлечения подстрок.

PHP mb_split function comments

En
Mb split Split multibyte string using regular expression