Preg match all: примеры (PHP)

Глобальный поиск по шаблону: функция preg_match_all
Раздел: Регулярные выражения
preg_match_all(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int|false
Функция preg_match_all в PHP

Функция preg_match_all выполняет глобальный поиск шаблона в строке. Она используется для извлечения всех совпадений регулярного выражения из заданного текста, в отличие от preg_match, который находит только первое совпадение.

Синтаксис
preg_match_all(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int|false
Аргументы
  • pattern: Строка с регулярным выражением.
  • subject: Исходная строка для поиска.
  • matches: Массив, заполняемый результатами поиска.
  • flags: Комбинация флагов: PREG_PATTERN_ORDER (по умолчанию), PREG_SET_ORDER, PREG_OFFSET_CAPTURE, PREG_UNMATCHED_AS_NULL.
  • offset: Позиция в строке для начала поиска (в байтах).
Примеры использования
Базовый пример
$text = 'cats: 3, dogs: 5, rabbits: 2';
preg_match_all('/\b\w+\b/', $text, $matches);
print_r($matches[0]);
Array
(
    [0] => cats
    [1] => 3
    [2] => dogs
    [3] => 5
    [4] => rabbits
    [5] => 2
)
С флагом PREG_SET_ORDER
$html = 'жирный и курсив';
preg_match_all('/<([bi])>(.*?)<\/\1>/', $html, $matches, PREG_SET_ORDER);
print_r($matches);
Array
(
    [0] => Array
        (
            [0] => жирный
            [1] => b
            [2] => жирный
        )
    [1] => Array
        (
            [0] => курсив
            [1] => i
            [2] => курсив
        )
)
С флагом PREG_OFFSET_CAPTURE
$str = 'a1 b2 c3';
preg_match_all('/\w\d/', $str, $matches, PREG_OFFSET_CAPTURE);
print_r($matches[0]);
Array
(
    [0] => Array
        (
            [0] => a1
            [1] => 0
        )
    [1] => Array
        (
            [0] => b2
            [1] => 3
        )
    [2] => Array
        (
            [0] => c3
            [1] => 6
        )
)
Похожие функции в PHP
  • preg_match() - находит только первое совпадение. Используется, когда требуется проверить наличие шаблона или извлечь первое вхождение.
  • preg_replace() - выполняет поиск и замену по регулярному выражению. Подходит для модификации строк.
  • preg_split() - разделяет строку по регулярному выражению. Полезно для сложного токенизирования.
  • preg_grep() - фильтрует массив по регулярному выражению. Работает с массивами строк.
Аналоги в других языках

Preg match all в Python

import re
text = 'cats: 3, dogs: 5'
matches = re.findall(r'\b\w+\b', text)
print(matches)
['cats', '3', 'dogs', '5']

Preg match all в Javascript

let text = 'cats: 3, dogs: 5';
let matches = text.match(/\b\w+\b/g);
console.log(matches);
['cats', '3', 'dogs', '5']

Preg match all в MySQL

SELECT REGEXP_SUBSTR('cats: 3, dogs: 5', '[[:alpha:]]+', 1, 1) as first_match;
first_match
cats
Типичные ошибки
Некорректный шаблон
preg_match_all('/[a-z/', 'test', $matches); // Незакрытая скобка
Warning: preg_match_all(): Compilation failed: missing terminating ]...
Использование строковых функций для шаблона
$pattern = "\\d+"; // Ожидается \d+, но будет интерпретировано как d+
preg_match_all($pattern, '123', $matches);
// Совпадений не найдено, т.к. шаблон ищет 'd+'
Забытый модификатор /u для UTF-8
preg_match_all('/\w+/', 'привет мир', $matches); // Кириллица не найдена
Array
(
    [0] => Array
        (
        )
)
Изменения в новых версиях PHP
  • PHP 7.2: Добавлен флаг PREG_UNMATCHED_AS_NULL, делающий несовпавшие подшаблоны NULL.
  • PHP 7.3: Поддержка escape-последовательностей для знаков пунктуации.
  • PHP 8.0: Функция теперь возвращает int|false вместо int. Невалидные шаблоны выбрасывают исключение.

PHP preg_match_all function comments

En
Preg match all Perform a global regular expression match