В регулярных выражениях крулгые скобки () выполняют роль группировки. Это мощный инструмент, который позволяет объединять несколько символов или токенов в единый блок.
Группировка используется для двух основных целей:
- Применение квантификаторов: Вы можете указать количество повторений не для одного символа, а для целой фразы. Например, выражение
(abc)+найдет последовательности 'abc', 'abcabc' и т.д. - Захват (Capturing): Все, что попало внутрь скобок, сохраняется в отдельную область памяти. В PHP функция
preg_matchпомещает эти совпадения в массив$matches. Элемент$matches[0]содержит вхождение всего шаблона, а$matches[1],$matches[2]и далее — текст, найденный соответствующими группами скобок.
Это позволяет легко извлекать части строк: даты, email-адреса, теги и другую структурированную информацию. Изучение группировки откроет вам доступ к сложной обработке текста в PHP.
- Модуль 1: Основы синтаксиса PHP
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Модуль 4: Условные конструкции
- Модуль 5: Циклы
- Модуль 6: Массивы
- Индексированные массивы.
- Ассоциативные массивы.
- Многомерные массивы.
- Добавление элементов в массив.
- Удаление элементов из массива.
- Функция count().
- Функция array_push() и array_pop().
- Функция array_shift() и array_unshift().
- Функция array_merge().
- Функция array_slice().
- Функция array_splice().
- Функция in_array().
- Функция array_search().
- Функция array_keys() и array_values().
- Функция array_unique().
- Функция array_reverse().
- Сортировка: sort(), rsort().
- Сортировка: asort(), arsort().
- Сортировка: ksort(), krsort().
- Функция array_map().
- Функция array_filter().
- Функция array_reduce().
- Функция array_walk().
- Функция array_column().
- Деструктуризация массивов.
- Iterator интерфейс
- Модуль 7: Функции
- Объявление функций.
- Вызов функций.
- Параметры функций.
- Возврат значений return.
- Значения параметров по умолчанию.
- Передача по значению.
- Передача по ссылке.
- Переменное количество аргументов.
- Оператор распаковки ....
- Типизация параметров.
- Типизация возвращаемых значений.
- Nullable типы.
- Union типы (PHP 8).
- Именованные аргументы (PHP 8).
- Анонимные функции.
- Стрелочные функции.
- Замыкания и use.
- Рекурсивные функции.
- Глобальные переменные в функциях.
- Статические переменные в функциях.
- IteratorAggregate интерфейс
- Модуль 8: Работа со строками
- Одинарные и двойные кавычки.
- Экранирование символов.
- Heredoc и Nowdoc синтаксис.
- Функция strlen().
- Функция substr().
- Функция str_replace().
- Функция strpos() и strrpos().
- Функция explode() и implode().
- Функция trim(), ltrim(), rtrim().
- Функция strtolower() и strtoupper().
- Функция ucfirst() и ucwords().
- Функция str_repeat().
- Функция htmlspecialchars().
- Модуль 9: Суперглобальные переменные
- Модуль 10: Работа с формами
- Модуль 11: Работа с файлами
- Модуль 12: Дата и время
- Модуль 13: Регулярные выражения
- Функция preg_match().
- Метасимволы.
- Группировка ().
- Модуль 14: Сессии и Cookie
- Модуль 15: Include и Require
- Модуль 16: Объектно-ориентированное программирование
- Модуль 17: Пространства имен
- Модуль 18: Обработка ошибок и исключений
- Модуль 19: Работа с JSON и XML
- Модуль 21: PDO - PHP Data Objects
- Модуль 22: Composer и зависимости
- Модуль 23: cURL и HTTP запросы
- Модуль 24: REST API
- Модуль 25: Безопасность
- Модуль 28: Работа с изображениями
- Модуль 29: Отправка email
- Модуль 30: Паттерны проектирования
- Модуль 31: Тестирование
- Модуль 32: Продвинутые возможности PHP 8+
1. Найти группы в шаблоне
Внимательно изучите приведённое регулярное выражение, предназначенное для разбора времени в формате 'часы:минуты'. Ваша задача — найти и выделить кликом все круглые скобки, которые создают группы захвата. Группа захвата — это часть шаблона, заключённая в круглые скобки, которая позволяет извлечь соответствующую часть строки при совпадении. Не отмечайте другие символы, такие как косые черты, двоеточия или цифры.
/^({{(~|~t1}}[0-2][0-9]{{)~|~t2}}:{{(~|~t3}}[0-5][0-9]{{)~|~t4}}$/2. Структура массива совпадений
Разметьте структуру массива $matches, полученного после выполнения функции preg_match с использованием группирующих скобок. Определите, какой элемент массива соответствует полному совпадению, а какие элементы содержат данные, захваченные первой и второй подгруппами регулярного выражения.
$matches = [
0 => "2023-12-25",
1 => "2023",
2 => "12",
3 => "25"
];3. Создание группы для захвата
В этом задании нужно дополнить регулярное выражение на PHP так, чтобы из строки 'ID: 452' извлекалось число и оно попадало в первую захватывающую группу. В текущем шаблоне отсутствует группировка вокруг последовательности цифр, из-за чего массив совпадений не будет содержать нужного элемента. Добавьте недостающие символы в отмеченные места внутри шаблона, чтобы preg_match записал значение идентификатора в $matches[1] и код корректно вывел число.
<?php
$text = 'ID: 452';
$pattern = '/ID: input1S\d+input2S/';
preg_match($pattern, $text, $matches);
echo $matches[1];4. Выбор правильного индекса
В данном задании представлен код PHP, который выполняет поиск email-адреса в тексте с использованием регулярных выражений и группировки. Шаблон регулярного выражения разделяет email на две группы: первая — локальная часть (до символа @), вторая — домен (после символа @). В команде echo $matches[...] необходимо выбрать правильный индекс массива $matches, чтобы вывести только домен email-адреса. Для заполнения пропуска используйте варианты из выпадающего списка.
$text = 'user@example.com';
if (preg_match('/^([^@]+)@(.+)$/', $text, $matches)) {
echo $matches[input1S];
}5. Шаблон и результат захвата
В левой колонке представлены регулярные выражения, которые проверяются на строке 'ab'. В правой колонке указаны значения, которые попадут в первую группу захвата ($matches[1]) после выполнения функции preg_match. Сопоставьте регулярное выражение с соответствующим результатом захвата. Обратите внимание: некоторые результаты могут повторяться.
/(a)b//a(b)//(ab)//()ab//^(.+)b$/'ab''a''b''a'''6. Группировка или экранирование
Перед вами фрагменты регулярных выражений, содержащие скобки. Разнесите их по двум категориям: «Группировка» (функциональные скобки, которые создают группу для применения квантификаторов или извлечения подстрок) и «Символ скобки» (экранированные скобки, которые означают буквальные символы '(' или ')'). Обратите внимание на наличие обратного слеша перед скобками — это ключевой признак экранирования.
(abc)+\(пример\)(x|y){2,5}\((?:незахватывающая)\)(test)\(скобка\)7. Порядок извлечения даты
Перед вами строки PHP-кода, которые используют регулярное выражение для извлечения частей даты из строки. Они перемешаны. Расставьте их в правильном порядке, чтобы сначала объявлялась строка с датой, затем создавался паттерн с группирующими скобками, после чего выполнялась проверка с помощью `preg_match` и, в случае успеха, выводился год, извлеченный из первой захватывающей группы.
$pattern = '/(\d{4})-(\d{2})-(\d{2})/';$dateStr = '2023-10-26';} echo "Год: " . $matches[1];if (preg_match($pattern, $dateStr, $matches)) {8. Предсказание содержимого группы
Проанализируйте код на PHP, который использует функцию preg_match с регулярным выражением для разбора строки 'Item_500'. Обратите внимание на структуру регулярного выражения и то, как группировка влияет на содержимое массива $matches. Выберите правильный результат, который будет выведен командой echo $matches[2].
$str = 'Item_500';
$pattern = '/([a-z]+)_(\d+)/i';
preg_match($pattern, $str, $matches);
echo $matches[2];9. Ошибка в синтаксисе группы
В этом фрагменте PHP-кода используются регулярные выражения с группировкой. Однако в шаблонах допущены ошибки: одна группа открыта круглой скобкой, но не закрыта, а в другой для группировки по ошибке применены фигурные скобки. Найдите строки с неправильным синтаксисом групп и исправьте их так, чтобы оба шаблона стали валидными и код выполнялся без ошибок.
<?php$patternLogin = '/user_(\d+/';$patternUrl = '/{https?|ftp}:\/\/example\.com/';$text = 'https://example.com user_42';var_dump(preg_match($patternLogin, $text), preg_match($patternUrl, $text));10. Сборка парсера имени файла
Из предложенных строк соберите PHP-скрипт, который разбирает имя файла 'image.png' на имя и расширение. Для этого используйте регулярное выражение с двумя захватывающими группами и функцию `preg_match`. В итоговом решении должны использоваться только необходимые строки, лишние следует проигнорировать.
<?php$filename = 'image.png';$pattern = '/^(.+)\.(.+)$/';preg_match($pattern, $filename, $matches);echo "Name: {$matches[1]} Ext: {$matches[2]}";?>echo "Name: {$matches[0]} Ext: {$matches[1]}";print_r($matches);11. Результат замены с обратной ссылкой
В данном задании представлен фрагмент PHP-кода, в котором используется функция preg_replace с регулярным выражением, содержащим группировку и обратные ссылки. Код выполняет замену частей строки, переставляя слова местами. Внимательно проанализируйте исходную строку и шаблон замены, затем определите, какая строка будет результатом выполнения кода. Введите полученную строку целиком, включая все пробелы и знаки препинания.
<?php
$text = 'Hello World';
$pattern = '/(\w+) (\w+)/';
$replacement = '$2 $1';
$result = preg_replace($pattern, $replacement, $text);
echo $result;
?>