Регулярные выражения в PHP с примерами: на практике
Регулярные выражения (regex) — это мощный инструмент для поиска, замены и анализа текста. В PHP они реализованы через набор функций PCRE (Perl Compatible Regular Expressions). Без них сложно представить валидацию форм, разбор логов или замену шаблонов в строках.
В этой статье мы разберём регулярные выражения в PHP с примерами, которые вы сможете сразу применить в своих проектах. Мы не будем углубляться в теорию — только практика, код и реальные сценарии.
1. Основные функции для работы с регулярками в PHP
В PHP есть три ключевые функции, которые покрывают 95% задач:
preg_match()— поиск первого совпадения.preg_match_all()— поиск всех совпадений.preg_replace()— замена по шаблону.preg_split()— разбиение строки по шаблону.
Все функции требуют три параметра: шаблон (pattern), строку (subject) и необязательные флаги.
Пример 1: Проверка email
<?php
$email = "user@example.com";
$pattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/";
if (preg_match($pattern, $email)) {
echo "Email корректен";
} else {
echo "Email некорректен";
}
?>
Разберём шаблон: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
^— начало строки.[a-zA-Z0-9._%+-]+— один или более разрешённых символов.@— буквально символ @.[a-zA-Z0-9.-]+— доменное имя.\.— точка (экранированная).[a-zA-Z]{2,}— доменная зона (минимум 2 буквы).$— конец строки.
Пример 2: Извлечение всех ссылок из HTML
<?php
$html = '<a href="https://pythonlib.ru">Сайт</a> и <a href="/about">О нас</a>';
$pattern = '/href="([^"]+)"/';
preg_match_all($pattern, $html, $matches);
print_r($matches[1]); // Выведет массив ссылок
?>
Здесь ([^"]+) — это захватывающая группа, которая ищет всё, кроме кавычек, внутри атрибута href.
2. Модификаторы и их практическое применение
Модификаторы меняют поведение регулярного выражения. Они ставятся после закрывающего слеша (/).
i— регистронезависимый поиск.m— многострочный режим (^ и $ работают для каждой строки).s— точка включает перенос строки.U— ленивый режим (по умолчанию жадный).u— поддержка UTF-8.
Пример 3: Поиск слова без учёта регистра
<?php
$text = "PHP — это мощный язык. php используется везде.";
$pattern = "/php/i";
preg_match_all($pattern, $text, $matches);
echo count($matches[0]); // Выведет 2
?>
Пример 4: Работа с кириллицей (UTF-8)
<?php
$text = "Привет, мир!";
$pattern = "/[а-яё]+/ui"; // u — UTF-8, i — регистронезависимость
preg_match_all($pattern, $text, $matches);
print_r($matches[0]); // ['Привет', 'мир']
?>
Без модификатора u кириллица будет обработана неправильно, потому что PHP считает каждый байт отдельным символом.
3. Замена и разбиение строк с помощью регулярных выражений
Функция preg_replace() позволяет заменять части строки по шаблону. А preg_split() — разбивать строку как explode, но с возможностью использовать регулярку.
Пример 5: Очистка текста от HTML-тегов
<?php
$html = "<h1>Заголовок</h1><p>Текст с <b>жирным</b> словом</p>";
$clean = preg_replace("/<[^>]+>/", "", $html);
echo $clean; // ЗаголовокТекст с жирным словом
?>
Шаблон <[^>]+> находит всё, что начинается с <, заканчивается на > и содержит хотя бы один символ внутри.
Пример 6: Маскирование номера телефона
<?php
$phone = "+7 (123) 456-78-90";
$pattern = "/(\d{3})\d{3}-\d{2}-\d{2}/";
$replacement = "+7 ($1) ***-**-**";
$masked = preg_replace($pattern, $replacement, $phone);
echo $masked; // +7 (123) ***-**-**
?>
Здесь $1 — это обратная ссылка на первую захваченную группу (\d{3}).
Пример 7: Разбиение строки по нескольким разделителям
<?php
$data = "яблоко, груша; апельсин|банан";
$fruits = preg_split("/[,;|]+/", $data);
print_r($fruits); // ['яблоко', 'груша', 'апельсин', 'банан']
?>
Шаблон [,;|]+ означает: один или более символов из набора (запятая, точка с запятой, вертикальная черта).
4. Продвинутые техники: lookahead и lookbehind
Lookahead (опережающая проверка) и lookbehind (ретроспек