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()), если разбивка может завершиться ошибкой.
Базовый пример
Классический сценарий использования — разбивка строки по изменяющемуся разделителю, например по любому количеству пробелов или запятых:
Шаблон [\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()— замена текста по шаблону.