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

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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

Регулярные выражения (regex) — это последовательности символов, задающие шаблон для поиска и манипуляции строками. В PHP они реализованы через библиотеку PCRE (Perl Compatible Regular Expressions) и предоставляют разработчикам гибкие возможности для валидации данных, парсинга текста и замены подстрок. В этой статье мы разберем основные функции, синтаксис и практические примеры использования регулярных выражений в PHP.

Основные функции PHP для работы с регулярными выражениями

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

preg_match() — поиск первого совпадения

Функция preg_match() ищет первое совпадение с шаблоном в строке. Она возвращает 1, если совпадение найдено, 0 — если нет, и FALSE в случае ошибки.

<?php
$text = "Мой email: example@mail.com и test@domain.org";
$pattern = "/[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/";

if (preg_match($pattern, $text, $matches)) {
    echo "Найден email: " . $matches[0];
    // Выведет: Найден email: example@mail.com
}
?>

preg_match_all() — поиск всех совпадений

В отличие от preg_match(), эта функция находит все совпадения в строке и помещает их в многомерный массив.

<?php
$text = "Мой email: example@mail.com и test@domain.org";
$pattern = "/[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/";

preg_match_all($pattern, $text, $matches);
print_r($matches[0]);
// Выведет: Array ( [0] => example@mail.com [1] => test@domain.org )
?>

preg_replace() — замена по шаблону

Функция preg_replace() заменяет все совпадения с шаблоном на указанную строку. Она поддерживает обратные ссылки и модификаторы.

<?php
$text = "Сегодня 15.03.2024, а завтра будет 16.03.2024";
$pattern = "/(\d{2})\.(\d{2})\.(\d{4})/";
$replacement = "$3-$2-$1";

echo preg_replace($pattern, $replacement, $text);
// Выведет: Сегодня 2024-03-15, а завтра будет 2024-03-16
?>

preg_split() — разбиение строки по шаблону

Функция preg_split() разбивает строку на массив по указанному шаблону. Это аналог explode(), но с поддержкой регулярных выражений.

<?php
$text = "яблоко, груша; банан: апельсин";
$pattern = "/[,;: ]+/";

$fruits = preg_split($pattern, $text);
print_r($fruits);
// Выведет: Array ( [0] => яблоко [1] => груша [2] => банан [3] => апельсин )
?>

Синтаксис регулярных выражений

Регулярные выражения в PHP заключаются в разделители (обычно слеши /) и могут содержать модификаторы после закрывающего разделителя. Рассмотрим основные элементы синтаксиса.

Метасимволы и квантификаторы

  • Символьные классы: . (любой символ), \d (цифра), \w (буква, цифра, подчеркивание), \s (пробельный символ)
  • Квантификаторы: * (0 или более), + (1 или более), ? (0 или 1), {n,m} (от n до m)
  • Якоря: ^ (начало строки), $ (конец строки), \b (граница слова)
  • Группировка: () (захват группы), (?:) (незахватывающая группа)
  • Альтернатива: | (логическое ИЛИ)

Модификаторы шаблонов

  • i — регистронезависимый поиск
  • m — многострочный режим (^ и $ работают для каждой строки)
  • s — метасимвол . включает перевод строки
  • u — поддержка Unicode (обязателен для работы с кириллицей)
  • x — игнорирование пробелов в шаблоне (для читаемости)
<?php
// Пример с модификаторами
$text = "Привет, Мир!";
$pattern = "/привет/ui"; // u - для кириллицы, i - регистронезависимый

if (preg_match($pattern, $text)) {
    echo "Совпадение найдено!"; // Выведет: Совпадение найдено!
}
?>

Практические примеры использования

Валидация email-адреса

Одна из самых частых задач — проверка корректности email. Хотя RFC 5322 задает сложные правила, для большинства проектов достаточно упрощенного шаблона.

<?php
function validateEmail($email) {
    $pattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/";
    return preg_match($pattern, $email) === 1;
}

$emails = ["test@mail.com", "invalid-email", "user@domain.co.uk"];
foreach ($emails as $email) {
    echo "$email: " . (validateEmail($email) ? "валидный" : "невалидный") . "\n";
}
// Выведет:
// test@mail.com: валидный
// invalid-email: невалидный
// user@domain.co.uk: валидный
?>

Извлечение URL из текста

Часто требуется найти все ссылки в тексте. Следующий пример демонстрирует извлечение URL с поддержкой HTTP и HTTPS протоколов.

<?php
$text = "Пос                

Блоги

Рекомендаций по книгам