Вы сказали:
Объяснить подробно регулярные выражения на PHP
1 '/\[(\d+)\]\s*–\s*([^:]+):\s*(.*?)(?=\s*\[\d+\]|$)/s'
и
2 '/(?:(\d+)\)\s*([^;]+);)|(?:(\d+)\s*–\s*([^;]+);)|(?:([A-Za-z])\)\s*([^;]+);)/'
Давайте разберём оба регулярных выражения, чтобы понять, как они работают на PHP.
/\[(\d+)\]\s*–\s*([^:]+):\s*(.*?)(?=\s*\[\d+\]|$)/s
\[(\d+)\] —
\[ и \] — символы квадратных скобок, которые экранированы с помощью обратного слэша, так как квадратные скобки являются специальными символами в регулярных выражениях.
(\d+) — захватывающая группа, которая находит одно или несколько чисел. Это выражение находит число внутри квадратных скобок, например, [123].
\s* —
Совпадает с нулём или более пробельными символами (пробелами, табуляциями и т.д.).
– —
Это просто символ тире (минус), который соответствует конкретному символу "–". Важно заметить, что это не обычный дефис, а длинное тире, так что регулярное выражение будет искать именно его.
\s* —
Совпадает с нулём или более пробельными символами.
([^:]+) —
Захватывающая группа, которая ищет строку, состоящую из символов, не являющихся двоеточием ([^:] — это отрицательное множество). Это выражение захватывает текст до двоеточия.
: —
Символ двоеточия, после которого ожидается пробел.
\s* —
Совпадает с нулём или более пробельными символами.
(.*?) —
Захватывающая группа для текста после двоеточия.
.*? — это "жадный" квантификатор (точка означает любой символ, а звездочка — что символы могут повторяться), но ? делает его "нежадным", что означает, что он будет захватывать минимальное количество символов до первого совпадения с шаблоном, который следует после него.
(?=\s*\[\d+\]|$) —
Это позитивный lookahead, который проверяет, что за захваченным текстом будет либо строка, которая начинается с пробела и квадратных скобок с числом, либо конец строки.
\s*\[\d+\] — это проверка на то, что после текста будет пробел и квадратные скобки с числом.
|$ — это альтернатива, которая говорит, что после текста может быть конец строки (знак $).
Флаг /s —
Это флаг, который изменяет поведение точки '.', чтобы она могла сопоставляться не только с обычными символами, но и с символами новой строки. То есть теперь выражение будет захватывать текст, включая переносы строк.
Допустим, у нас есть строка:
csharp[123] – Заголовок: Это описание первого пункта.
[456] – Другой заголовок: Описание второго пункта.
Регулярное выражение будет искать структуры вроде:
[123] – Заголовок: Это описание первого пункта
[456] – Другой заголовок: Описание второго пункта
И разобьёт на:
[123] — захвачено как число.
Заголовок — захвачено как текст до двоеточия.
Это описание первого пункта — описание после двоеточия.
/(?:(\d+)\)\s*([^;]+);)|(?:(\d+)\s*–\s*([^;]+);)|(?:([A-Za-z])\)\s*([^;]+);)/
(?: ... ) —
Это "незахватывающая" группа. Она не будет сохранять результат в отдельной переменной, но используется для организации структуры регулярного выражения.
(\d+)\) —
Захватывающая группа для числа (\d+), за которым следует закрывающая круглая скобка. Это соответствует шаблону типа 1) или 123).
\s* —
Совпадает с нулём или более пробельными символами.
([^;]+) —
Захватывающая группа для текста, который не содержит точку с запятой. Это будет текст до первого символа ;.
; —
Символ точка с запятой, который обязательно должен быть в конце.
| —
Это оператор "или", который позволяет использовать несколько альтернативных шаблонов.
Второй шаблон (?:(\d+)\s*–\s*([^;]+);) похож на первый, но с тире вместо закрывающей скобки, что подходит для шаблонов типа 1 – Текст;.
Третий шаблон (?:([A-Za-z])\)\s*([^;]+);) —
Захватывает одиночную букву ([A-Za-z]) (как латинскую заглавную, так и строчную), за которой следует закрывающая скобка и текст до точке с запятой. Это подходит для выражений типа A) Текст;.
Строка типа:
css1) Первый элемент;
2 – Второй элемент;
A) Третий элемент;
Регулярное выражение разобьёт её на:
1) и Первый элемент
2 и Второй элемент
A) и Третий элемент
Первое регулярное выражение используется для извлечения информации, содержащейся в структурах вроде [123] – Тема: Описание, где нужно выделить число, тему и описание.
Второе регулярное выражение подходит для разбора строк, содержащих нумерацию с различными разделителями, такими как 1), 2 –, A) и так далее, и позволяет извлечь как номер (или букву), так и соответствующий текст до точки с запятой.