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. Невалидные шаблоны выбрасывают исключение.
Расширенные примеры
Парсинг HTML с именованными группами
Пример php
$html = 'Ссылка 1 Ссылка 2';
preg_match_all('/(?P[^<]+)<\/a>/', $html, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
echo $match['text'] . ' → ' . $match['url'] . "\n";
} Ссылка 1 → page1.html Ссылка 2 → page2.html
Рекурсивное извлечение вложенных скобок
Пример php
$str = 'a(b(c)d)e';
preg_match_all('/\(((?:[^()]++|(?R))*)\)/', $str, $matches);
print_r($matches[1]);Array
(
[0] => b(c)d
[1] => c
)Поиск с ограничением глубины
Пример php
$text = 'Дата: 2023-12-01, Время: 14:30, Дата: 2024-01-15';
preg_match_all('/(Дата|Время):\s*(\d{4}-\d{2}-\d{2}|\d{2}:\d{2})/', $text, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
echo $match[1] . ': ' . $match[2] . "\n";
}Дата: 2023-12-01 Время: 14:30 Дата: 2024-01-15
PHP preg_match_all function comments
En
Preg match all Perform a global regular expression match