Группировка ()

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

В регулярных выражениях крулгые скобки () выполняют роль группировки. Это мощный инструмент, который позволяет объединять несколько символов или токенов в единый блок.

Группировка используется для двух основных целей:

  • Применение квантификаторов: Вы можете указать количество повторений не для одного символа, а для целой фразы. Например, выражение (abc)+ найдет последовательности 'abc', 'abcabc' и т.д.
  • Захват (Capturing): Все, что попало внутрь скобок, сохраняется в отдельную область памяти. В PHP функция preg_match помещает эти совпадения в массив $matches. Элемент $matches[0] содержит вхождение всего шаблона, а $matches[1], $matches[2] и далее — текст, найденный соответствующими группами скобок.

Это позволяет легко извлекать части строк: даты, email-адреса, теги и другую структурированную информацию. Изучение группировки откроет вам доступ к сложной обработке текста в PHP.

Список тем

1. Найти группы в шаблоне

id: 39104_regex_group_01_click

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

Кликните по всем фрагментам, которые подходят под условие задания.
/^({{(~|~t1}}[0-2][0-9]{{)~|~t2}}:{{(~|~t3}}[0-5][0-9]{{)~|~t4}}$/
Сообщения
Проверить
Показать подсказку

2. Структура массива совпадений

id: 39104_regex_group_02_highlight

Разметьте структуру массива $matches, полученного после выполнения функции preg_match с использованием группирующих скобок. Определите, какой элемент массива соответствует полному совпадению, а какие элементы содержат данные, захваченные первой и второй подгруппами регулярного выражения.

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
$matches = [
    0 => "2023-12-25",
    1 => "2023",
    2 => "12",
    3 => "25"
];
Первая подгруппа
Вторая подгруппа
Полное совпадение
Сообщения
Проверить
Показать подсказку

3. Создание группы для захвата

id: 39104_regex_group_03_replace

В этом задании нужно дополнить регулярное выражение на PHP так, чтобы из строки 'ID: 452' извлекалось число и оно попадало в первую захватывающую группу. В текущем шаблоне отсутствует группировка вокруг последовательности цифр, из-за чего массив совпадений не будет содержать нужного элемента. Добавьте недостающие символы в отмеченные места внутри шаблона, чтобы preg_match записал значение идентификатора в $matches[1] и код корректно вывел число.

Заполните пропуски
<?php
$text = 'ID: 452';
$pattern = '/ID: input1S\d+input2S/';
preg_match($pattern, $text, $matches);
echo $matches[1];
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Выбор правильного индекса

id: 39104_regex_group_04_select

В данном задании представлен код PHP, который выполняет поиск email-адреса в тексте с использованием регулярных выражений и группировки. Шаблон регулярного выражения разделяет email на две группы: первая — локальная часть (до символа @), вторая — домен (после символа @). В команде echo $matches[...] необходимо выбрать правильный индекс массива $matches, чтобы вывести только домен email-адреса. Для заполнения пропуска используйте варианты из выпадающего списка.

Нужно правильно расставить в пропуски предложенные варианты
$text = 'user@example.com';
if (preg_match('/^([^@]+)@(.+)$/', $text, $matches)) {
    echo $matches[input1S];
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Шаблон и результат захвата

id: 39104_regex_group_05_compare

В левой колонке представлены регулярные выражения, которые проверяются на строке 'ab'. В правой колонке указаны значения, которые попадут в первую группу захвата ($matches[1]) после выполнения функции preg_match. Сопоставьте регулярное выражение с соответствующим результатом захвата. Обратите внимание: некоторые результаты могут повторяться.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
/(a)b/
/a(b)/
/(ab)/
/()ab/
/^(.+)b$/
'ab'
'a'
'b'
'a'
''
Сообщения
Проверить
Показать подсказку

6. Группировка или экранирование

id: 39104_regex_group_06_sort

Перед вами фрагменты регулярных выражений, содержащие скобки. Разнесите их по двум категориям: «Группировка» (функциональные скобки, которые создают группу для применения квантификаторов или извлечения подстрок) и «Символ скобки» (экранированные скобки, которые означают буквальные символы '(' или ')'). Обратите внимание на наличие обратного слеша перед скобками — это ключевой признак экранирования.

Перетяните элементы в соответствующие блоки
Группировка
Символ скобки
(abc)+
\(пример\)
(x|y){2,5}
\(
(?:незахватывающая)
\)
(test)
\(скобка\)
Сообщения
Проверить
Показать подсказку

7. Порядок извлечения даты

id: 39104_regex_group_07_sequencing

Перед вами строки PHP-кода, которые используют регулярное выражение для извлечения частей даты из строки. Они перемешаны. Расставьте их в правильном порядке, чтобы сначала объявлялась строка с датой, затем создавался паттерн с группирующими скобками, после чего выполнялась проверка с помощью `preg_match` и, в случае успеха, выводился год, извлеченный из первой захватывающей группы.

Расставьте строки в правильном порядке
$pattern = '/(\d{4})-(\d{2})-(\d{2})/';
$dateStr = '2023-10-26';
}
    echo "Год: " . $matches[1];
if (preg_match($pattern, $dateStr, $matches)) {
Сообщения
Проверить
Показать подсказку

8. Предсказание содержимого группы

id: 39104_regex_group_08_predict

Проанализируйте код на 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. Ошибка в синтаксисе группы

id: 39104_regex_group_09_error

В этом фрагменте 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));
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

10. Сборка парсера имени файла

id: 39104_regex_group_10_build

Из предложенных строк соберите 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);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

11. Результат замены с обратной ссылкой

id: 39104_regex_group_11_give

В данном задании представлен фрагмент PHP-кода, в котором используется функция preg_replace с регулярным выражением, содержащим группировку и обратные ссылки. Код выполняет замену частей строки, переставляя слова местами. Внимательно проанализируйте исходную строку и шаблон замены, затем определите, какая строка будет результатом выполнения кода. Введите полученную строку целиком, включая все пробелы и знаки препинания.

Что должно получиться?
<?php
    $text = 'Hello World';
    $pattern = '/(\w+) (\w+)/';
    $replacement = '$2 $1';
    $result = preg_replace($pattern, $replacement, $text);
    echo $result;
?>
Сообщения
Проверить
Показать подсказку

PHP: запуск кода в браузере

id: 39104_compiler
🐘
Запустить тренажёр (PHP)
НайтиКурс.Ру