На 23 уроке мы разберем одну из самых мощных и гибких тем в программировании, это регулярные выражения в PHP. Если вы раньше сталкивались с задачами поиска, проверки или замены текста, то регулярные выражения станут вашим надежным инструментом.
Регулярные выражения (Regular Expressions, RegEx) это специальные шаблоны, которые позволяют описывать структуру текста. С их помощью можно:
- Проверять соответствие строки определенному формату (например, email или номеру телефона).
- Извлекать нужные фрагменты из текста.
- Заменять части строки по заданным правилам.
Представьте, что вы детектив, который ищет улики в огромном документе. Регулярные выражения это ваш «увеличитель», который помогает находить нужные «следы» быстро и точно.
Основы синтаксиса регулярных выражений
Перед тем как писать код, разберемся с базовыми элементами RegEx.
1. Литералы
Это обычные символы, которые ищутся «как есть». Например, шаблон cat
найдет последовательность букв «c», «a», «t».
2. Метасимволы
Специальные символы, которые задают правила поиска:
Символ | Описание |
---|---|
. |
Любой символ, кроме переноса строки. |
^ |
Начало строки. |
$ |
Конец строки. |
* |
Ноль или больше повторений предыдущего символа. |
+ |
Одно или больше повторений предыдущего символа. |
? |
Ноль или одно повторение предыдущего символа. |
\d |
Цифра (эквивалент [0-9] ). |
\w |
Буква, цифра или символ подчеркивания (эквивалент [a-zA-Z0-9_] ). |
\s |
Пробельный символ (пробел, табуляция, перенос строки). |
[ ] |
Набор символов. Например, [a-z] — любая строчная буква. |
( ) |
Группировка символов. Позволяет применять операторы к группе. |
3. Модификаторы
Флаги, которые меняют поведение регулярного выражения:
i
— игнорировать регистр (например,/[a-z]/i
найдет и заглавные буквы).m
— многострочный режим (символы^
и$
работают для каждой строки).s
— точка.
включает перенос строки.
Поиск с помощью регулярных выражений в PHP
PHP предоставляет несколько функций для работы с RegEx. Начнем с поиска.
Функция preg_match()
Используется для проверки соответствия строки шаблону. Возвращает 1
, если совпадение найдено, и 0
в противном случае.
Пример 1: Проверка email
$email = "user@example.com"; $pattern = '/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/'; if (preg_match($pattern, $email)) { echo "Email корректен!"; } else { echo "Некорректный email."; }
Разберем шаблон:
^
— начало строки.[a-zA-Z0-9._-]+
— имя пользователя: буквы, цифры, точки, подчеркивания, дефисы (1 или более символов).@
— символ «@».[a-zA-Z0-9.-]+
— домен: буквы, цифры, точки, дефисы.\.
— точка перед доменом верхнего уровня.[a-zA-Z]{2,6}$
— домен верхнего уровня (от 2 до 6 букв).$
— конец строки.
Функция preg_match_all()
Ищет все совпадения в строке и возвращает их количество.
Пример 2: Поиск всех чисел в тексте
$text = "В 2025 году я хочу заработать 50000 рублей. А в 2024 — уже 100000."; $pattern = '/\d+/'; preg_match_all($pattern, $text, $matches); print_r($matches[0]); // Выведет: Array ( [0] => 2025 [1] => 50000 [2] => 2024 [3] => 100000 )
Замена текста с помощью preg_replace()
Эта функция заменяет все совпадения с шаблоном на указанную строку.
Пример 1: Замена даты в формате DD-MM-YYYY на YYYY/MM/DD
$date = "Сегодня 31-12-2025"; $pattern = '/(\d{2})-(\d{2})-(\d{4})/'; $replacement = '$3/$2/$1'; // Обратные ссылки на группы echo preg_replace($pattern, $replacement, $date); // Выведет: Сегодня 2025/12/31
Пояснение:
(\d{2})
— группа из двух цифр (день).(\d{2})
— месяц.(\d{4})
— год.$3/$2/$1
— меняем порядок групп: год/месяц/день.
Практические задачи
Задача 1: Проверка номера телефона
Напишите регулярное выражение для проверки номера телефона в формате +7 (XXX) XXX-XX-XX
.
Решение:
$phone = "+7 (912) 345-67-89"; $pattern = '/^\+7 \(\d{3}\) \d{3}-\d{2}-\d{2}$/'; echo preg_match($pattern, $phone) ? "Номер верный!" : "Ошибка в номере.";
Задача 2: Извлечение хэштегов из текста
Найдите все хэштеги (слова, начинающиеся с #
) в строке.
Решение:
$text = "Сегодня #отличный день для #программирования!"; $pattern = '/#\w+/'; preg_match_all($pattern, $text, $matches); print_r($matches[0]); // Array ( [0] => #отличный [1] => #программирования )
Задача 3: Удаление HTML-тегов
Удалите все HTML-теги из строки, оставив только текст.
Решение:
$html = "<div><h1>Заголовок</h1><p>Текст</p></div>"; $cleanText = preg_replace('/<[^>]+>/', '', $html); echo $cleanText; // Выведет: ЗаголовокТекст
Частые ошибки новичков
- Экранирование символов
Не забывайте экранировать специальные символы, например,\.
для поиска точки. - Жадные квантификаторы
По умолчанию*
и+
«жадные» — захватывают максимально возможный текст. Используйте.*?
для «ленивого» поиска. - Производительность
Сложные регулярные выражения могут замедлять код. Всегда тестируйте их на реальных данных.
Регулярные выражения это мощный инструмент, который открывает новые возможности для работы с текстом. Сегодня мы изучили основы RegEx. Научились искать и заменять текст, а также решили несколько практических задач. Не бойтесь применять регулярные выражения в своих проектах.
Если вы хотите углубить свои знания, рекомендую изучить документацию по регулярным выражениям в PHP и попрактиковаться на реальных задачах. А если вы только начинаете свой путь в PHP, не забудьте посмотрет мой полный курс с уроками по PHP для начинающих.