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

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

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

Начать курс

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

Блоги

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