Регулярные выражения в PHP: от теории к практике
Регулярные выражения (regex или regexp) — это мощный инструмент для поиска, замены и проверки строк по заданному шаблону. В PHP они реализованы через набор функций PCRE (Perl Compatible Regular Expressions) и позволяют решать задачи любой сложности: от валидации email до парсинга HTML-кода. В этой статье мы разберем синтаксис, основные функции и рассмотрим практические примеры, которые пригодятся каждому PHP-разработчику.
1. Основы синтаксиса регулярных выражений в PHP
Любое регулярное выражение в PHP заключается в разделители (обычно слэши /). После закрывающего разделителя можно указать модификаторы — флаги, меняющие поведение поиска.
$pattern = '/шаблон/модификаторы';
Основные метасимволы:
.— любой одиночный символ (кроме перевода строки)*— ноль или более повторений предыдущего символа+— одно или более повторений?— ноль или одно повторение (делает квантификатор ленивым)^— начало строки$— конец строки\d— цифра (0-9)\w— буква, цифра или подчёркивание\s— пробельный символ[]— класс символов (например,[a-z])()— группа для захвата
Популярные модификаторы:
i— регистронезависимый поискm— многострочный режим (^ и $ работают для каждой строки)u— поддержка UTF-8 (обязателен для кириллицы)s— точка также захватывает перевод строки
2. Функция preg_match(): поиск совпадений
preg_match() — самая популярная функция. Она проверяет, соответствует ли строка шаблону, и возвращает 1 (есть совпадение) или 0 (нет). Третий параметр — массив, в который записываются найденные совпадения.
Пример 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 некорректен";
}
// Вывод: Email корректен
?>
Пример 2. Извлечение данных из строки
<?php
$text = "Мой номер: +7 (999) 123-45-67";
$pattern = '/\+7\s*\(\d{3}\)\s*\d{3}-\d{2}-\d{2}/u';
if (preg_match($pattern, $text, $matches)) {
echo "Найден номер: " . $matches[0];
}
// Вывод: Найден номер: +7 (999) 123-45-67
?>
Обратите внимание: модификатор u обязателен, если в строке встречается кириллица или спецсимволы Юникода.
3. Функция preg_replace(): замена по шаблону
preg_replace() ищет в строке все совпадения с шаблоном и заменяет их на указанный текст. Можно использовать группы захвата $1, $2 и т.д. для подстановки частей исходного текста.
Пример 3. Форматирование телефонного номера
<?php
$phone = "89991234567";
$pattern = '/(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})/';
$replacement = '+7 ($2) $3-$4-$5';
$formatted = preg_replace($pattern, $replacement, $phone);
echo $formatted; // +7 (999) 123-45-67
?>
Пример 4. Очистка HTML от тегов (кроме разрешённых)
<?php
$html = "<b>Жирный</b> <script>alert('xss')</script> текст";
$pattern = '/<\s*\/?\s*(?!b|i|u|a\b)[^>]*>/ui';
$clean = preg_replace($pattern, '', $html);
echo $clean; // <b>Жирный</b> текст
?>
Здесь используется негативный просмотр вперёд (?!b|i|u|a\b) — теги b, i, u и a остаются, остальные удаляются.
4. Функция preg_split(): разбиение строки
preg_split() — аналог explode(), но с регулярным выражением в качестве разделителя. Это удобно для сложных текстов.
Пример 5. Разделение текста на предложения
<?php
$text = "Привет! Как дела? Всё хорошо. Завтра встретимся?";
$pattern = '/(?<=\.|\!|\?)\s+/u';
$sentences = preg_split($pattern, $text);
print_r($sentences);
/*
Array
(
[0] => Привет!
[1] => Как дела?
[2] => Всё хорошо.
[3] => Завтра встретимся?
)
*/
?>
Мы используем позитивный просмотр назад (?<=\.|\!|\?) — разделителем считается пробел, перед которым стоит точка, восклицательный или вопросительный знак.
Пример 6. Разбор URL-параметров
<?php
$query = "name=Иван&age=30&city=Москва";
$pattern = '/[&?]/';
$params = preg_split($pattern, $query);
foreach ($params as $param) {
echo $param . "<br>";
}
/*