W3docs

preg_split

Функция preg_split() в PHP разбивает строку на массив подстрок с помощью регулярного выражения в качестве разделителя.

Введение

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

На этой странице описаны сигнатура функции, все флаги, возвращаемое значение, а также практические шаблоны и подводные камни, с которыми вы столкнётесь при использовании функции в реальном коде.

Синтаксис

preg_split(
    string $pattern,
    string $subject,
    int $limit = -1,
    int $flags = 0
): array|false
ПараметрОписание
$patternРегулярное выражение-разделитель, включая ограничители вида /.../.
$subjectВходная строка для разбивки.
$limitМаксимальное количество частей. -1 (по умолчанию) или 0 означает отсутствие ограничения. При задании значения последняя часть содержит оставшуюся неразбитую подстроку.
$flagsБитовая маска констант PREG_SPLIT_* (см. ниже). Объединяются с помощью `

Функция возвращает массив подстрок в случае успеха или false, если шаблон недействителен. Исключений она не генерирует — проверяйте false (и обращайтесь к preg_last_error()), если разбивка может завершиться ошибкой.

Базовый пример

Классический сценарий использования — разбивка строки по изменяющемуся разделителю, например по любому количеству пробелов или запятых:

php— editable, runs on the server

Шаблон [\s,]+ соответствует одному или нескольким пробельным символам или запятым, поэтому и пробелы, и запятая выступают разделителями:

Array
(
    [0] => This
    [1] => is
    [2] => a
    [3] => test
    [4] => string
)

Поскольку + жадный, несколько разделителей подряд (запятая и пробел) схлопываются в одну точку разбивки, а не порождают пустые элементы.

Флаги

PREG_SPLIT_NO_EMPTY

Без этого флага разделитель в самом начале или конце строки, а также два разделителя подряд, которые шаблон не может объединить, порождают пустые строки в результате. PREG_SPLIT_NO_EMPTY убирает их:

<?php

$string = ',apple,,banana,';

// Without the flag: empty pieces appear.
print_r(preg_split('/,/', $string));

// With the flag: only real values remain.
print_r(preg_split('/,/', $string, -1, PREG_SPLIT_NO_EMPTY));

Первый вызов возвращает ['', 'apple', '', 'banana', '']; второй — ['apple', 'banana'].

PREG_SPLIT_DELIM_CAPTURE

Если шаблон содержит захватывающие группы, этот флаг включает захваченный текст в результат — удобно, когда нужно сохранить разделители, а не просто отбросить их:

<?php

$expression = '3+5*2-9';
$tokens = preg_split('/([+\-*\/])/', $expression, -1, PREG_SPLIT_DELIM_CAPTURE);

print_r($tokens);

Результат сохраняет и числа, и операторы: ['3', '+', '5', '*', '2', '-', '9'] — именно то, что нужно простому токенизатору выражений.

PREG_SPLIT_OFFSET_CAPTURE

Каждый элемент становится парой [$substring, $offset], где $offset — байтовая позиция в исходной строке. Удобно, когда нужно знать, откуда взялась каждая часть.

Ограничение количества разбивок

$limit ограничивает количество возвращаемых частей; последний элемент содержит оставшуюся неразбитую строку. Это идиоматический способ разбить строку на «первые N полей, а затем всё остальное»:

<?php

$logLine = 'ERROR 2024-01-01 Something broke: details here';

// Split into at most 3 parts on whitespace.
$parts = preg_split('/\s+/', $logLine, 3);

print_r($parts);

Результат: ['ERROR', '2024-01-01', 'Something broke: details here'] — третий элемент сохраняет внутренние пробелы, так как лимит был достигнут.

preg_split() vs explode()

Используйте explode(), когда разделитель — одна фиксированная строка: это быстрее и понятнее. Используйте preg_split(), когда разделитель является шаблоном: переменные пробелы, выбор из нескольких символов, регистронезависимое сопоставление или когда нужно сохранить разделители через PREG_SPLIT_DELIM_CAPTURE. Для обратного объединения массива в строку используйте implode().

Распространённые ошибки

  • Забытые ограничители шаблона. Первый аргумент — полное регулярное выражение, поэтому ему нужны ограничители: '/,/', а не ','. Передача голой строки — самая распространённая ошибка новичков.
  • Неэкранированные специальные символы. Символы ., +, | и * являются метасимволами регулярных выражений. Чтобы разбить по буквальной точке, экранируйте её ('/\./') или используйте preg_quote() для динамического ввода.
  • Лишние пустые строки. Разделители в начале или конце строки создают пустые элементы — добавьте PREG_SPLIT_NO_EMPTY, если они не нужны.

Связанные функции

  • explode() — разбивка по фиксированному строковому разделителю.
  • implode() — объединение массива обратно в строку.
  • preg_match() / preg_match_all() — поиск совпадений вместо разбивки.
  • preg_replace() — замена текста по шаблону.

Практика

Практика
Какова функция preg_split в PHP и когда её следует использовать?
Какова функция preg_split в PHP и когда её следует использовать?
Was this page helpful?