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

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

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

Начать курс

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

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

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

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

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

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

<?php
$text = "Привет, мир! PHP — это круто.";
$pattern = "/PHP/";

if (preg_match($pattern, $text)) {
    echo "Слово 'PHP' найдено!";
} else {
    echo "Совпадений нет.";
}
?>

Если нужно получить само совпадение, передайте третий аргумент — массив для результатов:

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

if (preg_match($pattern, $text, $matches)) {
    echo "Найден email: " . $matches[0];
}
?>

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

Функция preg_replace() заменяет все совпадения с шаблоном на указанную строку. Это аналог str_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] => апельсин )
?>

2. Метасимволы и синтаксис регулярных выражений

Чтобы эффективно использовать регулярные выражения, необходимо понимать их синтаксис. Вот основные метасимволы:

  • . — любой символ (кроме новой строки)
  • ^ — начало строки
  • $ — конец строки
  • * — 0 или более повторений
  • + — 1 или более повторений
  • ? — 0 или 1 повторение
  • \d — цифра (0-9)
  • \w — буква, цифра или подчеркивание
  • \s — пробельный символ
  • [abc] — любой символ из набора
  • (...) — группа захвата

Пример: проверка номера телефона

<?php
$phone = "+7 (123) 456-78-90";
$pattern = "/^\+7\s\(\d{3}\)\s\d{3}-\d{2}-\d{2}$/";

if (preg_match($pattern, $phone)) {
    echo "Номер телефона корректен!";
} else {
    echo "Неверный формат номера.";
}
?>

3. Продвинутые техники и модификаторы

Модификаторы изменяют поведение регулярного выражения. Они указываются после закрывающего слеша. Рассмотрим самые полезные:

  • i — регистронезависимый поиск
  • m — многострочный режим (^ и $ работают для каждой строки)
  • s — точка включает символ новой строки
  • u — поддержка UTF-8 (обязателен для русского языка)

Пример: поиск слова без учета регистра

<?php
$text = "PHP — это PHP, а не php?";
$pattern = "/php/i"; // Модификатор i

preg_match_all($pattern, $text, $matches);
echo "Найдено совпадений: " . count($matches[0]);
// Выведет: Найдено совпадений: 3
?>

Пример: работа с Unicode (русский язык)

<?php
$text = "Привет, мир!";
$pattern = "/[а-яё]+/ui"; // Только русские буквы

preg_match_all($pattern, $text, $matches);
print_r($matches[0]);
// Array ( [0] => Привет [1] => мир )
?>

Жадные и ленивые квантификаторы

По умолчанию квантификаторы (*, +) являются жадными — они захватывают максимально возможную строку. Чтобы сделать их ленивыми, добавьте ? после квантификатора.

<?php
$text = "<b>Жирный</b> и <b>еще жирный</b>";

// Жадный режим
preg_match("/<b>.*<\/b>/", $text, $matches);
echo "Жадный: " . $matches[0] . "\n";
// <b>Жирный</b> и <b>еще жирный</b>

// Ленивый режим
preg_match("/<b>.*?<\/b>/", $text, $matches);
echo "Ленивый: " . $matches[0];
// &                

Блоги

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