Регулярные выражения в 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 = "Пос