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

Использование preg_split для работы со строками в PHP
Раздел: Регулярные выражения
preg_split(string $pattern, string $subject, int $limit = -1, int $flags = 0): array|false
Основы функции preg_split в PHP

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

Аргументы функции:

  • pattern (string) - регулярное выражение для поиска разделителей
  • subject (string) - входная строка для обработки
  • limit (int) - ограничивает количество элементов в результате. При отрицательном значении ограничение не учитывается. Значение -1 или 0 означает отсутствие ограничений
  • flags (int) - комбинация констант: PREG_SPLIT_NO_EMPTY (исключает пустые строки), PREG_SPLIT_DELIM_CAPTURE (включает захваченные подвыражения), PREG_SPLIT_OFFSET_CAPTURE (добавляет смещение каждого вхождения)
Простые примеры работы
Базовое разделение
$str = "яблоко,груша,вишня,слива";
$result = preg_split("/,/", $str);
print_r($result);
Array
(
    [0] => яблоко
    [1] => груша
    [2] => вишня
    [3] => слива
)
С флагом PREG_SPLIT_NO_EMPTY
$str = "кофе,,чай,,";
$result = preg_split("/,/", $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($result);
Array
(
    [0] => кофе
    [1] => чай
)
С ограничением количества элементов
$str = "один два три четыре пять";
$result = preg_split("/\s+/", $str, 3);
print_r($result);
Array
(
    [0] => один
    [1] => два
    [2] => три четыре пять
)
Альтернативные функции PHP

explode() - разделяет строку по фиксированной подстроке. Работает значительно быстрее при простых разделителях.

str_split() - разбивает строку на части заданной длины. Подходит для обработки строк с фиксированной шириной полей.

token_get_all() - разбивает PHP-код на лексемы. Специализированная функция для анализа кода.

Выбор между preg_split и explode зависит от сложности разделителя. Для простых символов-разделителей explode предпочтительнее из-за скорости работы.

Частые ошибки
Некорректный шаблон регулярного выражения
$result = preg_split("/[/", "текст");
var_dump($result);
Warning: preg_split(): Compilation failed: missing terminating ]...
Использование неэкранированных разделителей
$str = "apple.price|banana.price";
$result = preg_split("/|/", $str);
print_r($result);
Array
(
    [0] => a
    [1] => p
    [2] => p
    ... каждый символ как отдельный элемент
)
Забытый флаг PREG_SPLIT_NO_EMPTY
$str = "мама,,мыла,,раму";
$result = preg_split("/,/", $str);
print_r($result);
Array
(
    [0] => мама
    [1] => 
    [2] => мыла
    [3] => 
    [4] => раму
)
Изменения в новых версиях

В PHP 8.0 функция preg split выбрасывает исключение ValueError при передаче некорректного значения параметра limit (null или нечисловое значение). Ранее такие случаи обрабатывались как limit = -1.

// PHP 8+
try {
    preg_split('/,/', 'a,b,c', null);
} catch (ValueError $e) {
    echo $e->getMessage();
}
preg_split(): Argument #3 ($limit) must be of type int

В PHP 7.3 добавлена поддержка escape-последовательности \K в регулярных выражениях, что влияет на поведение разделения.

Расширенные примеры применения
Разбор сложных данных
Пример php
$data = "Иванов И.И.: 25 лет, Петров П.П.: 30 лет";
$result = preg_split("/\s*[:,]\s*/", $data);
print_r($result);
Array
(
    [0] => Иванов И.И.
    [1] => 25 лет
    [2] => Петров П.П.
    [3] => 30 лет
)
Извлечение с захватом разделителей
Пример php
$str = "10+20-30*40";
$result = preg_split("/([+\-*\/])/", $str, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($result);
Array
(
    [0] => 10
    [1] => +
    [2] => 20
    [3] => -
    [4] => 30
    [5] => *
    [6] => 40
)
Разделение с сохранением позиций
Пример php
$str = "first second third";
$result = preg_split("/\s+/", $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($result);
Array
(
    [0] => Array
        (
            [0] => first
            [1] => 0
        )
    [1] => Array
        (
            [0] => second
            [1] => 6
        )
)
Обработка многострочного текста
Пример php
$text = "Строка 1\n\nСтрока 2\n\n\nСтрока 3";
$result = preg_split("/\n+/", $text, -1, PREG_SPLIT_NO_EMPTY);
print_r($result);
Array
(
    [0] => Строка 1
    [1] => Строка 2
    [2] => Строка 3
)
Аналоги в других языках

Preg split в Python

import re
str = "яблоко,груша,вишня"
result = re.split(r',', str)
print(result)
['яблоко', 'груша', 'вишня']

Preg split в Javascript

let str = "яблоко,груша,вишня";
let result = str.split(/,/);
console.log(result);
['яблоко', 'груша', 'вишня']

Preg split в MySQL

SELECT 
  REGEXP_SUBSTR('яблоко,груша,вишня', '[^,]+', 1, 1) AS item1,
  REGEXP_SUBSTR('яблоко,груша,вишня', '[^,]+', 1, 2) AS item2;
item1: яблоко
item2: груша

Основное отличие в PHP - поддержка флагов, изменяющих поведение функции, и интеграция с экосистемой PCRE.

PHP preg_split function comments

En
Preg split Split string by a regular expression