Регулярные выражения в 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];
// &