Урок 23: Работа с регулярными выражениями в PHP

На 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; // Выведет: ЗаголовокТекст

Частые ошибки новичков

  1. Экранирование символов
    Не забывайте экранировать специальные символы, например, \. для поиска точки.
  2. Жадные квантификаторы
    По умолчанию * и + «жадные» — захватывают максимально возможный текст. Используйте .*? для «ленивого» поиска.
  3. Производительность
    Сложные регулярные выражения могут замедлять код. Всегда тестируйте их на реальных данных.

Регулярные выражения это мощный инструмент, который открывает новые возможности для работы с текстом. Сегодня мы изучили основы RegEx. Научились искать и заменять текст, а также решили несколько практических задач. Не бойтесь применять регулярные выражения в своих проектах.

Если вы хотите углубить свои знания, рекомендую изучить документацию по регулярным выражениям в PHP и попрактиковаться на реальных задачах. А если вы только начинаете свой путь в PHP, не забудьте посмотрет мой полный курс с уроками по PHP для начинающих.