← Назад к вопросам

Как работают регулярные выражения в PHP?

3.0 Senior🔥 71 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работают регулярные выражения в PHP

Регулярные выражения (regex) в PHP — это мощный инструмент для поиска, проверки и манипуляции текстом на основе шаблонов. PHP предоставляет два основных набора функций для работы с regex: PCRE (Perl Compatible Regular Expressions) и POSIX-расширенные (устаревшие с PHP 7.0). В современной разработке используется исключительно PCRE, реализованный через функции preg_*.

Основные компоненты регулярных выражений

Регулярные выражения состоят из:

  • Литералов — обычных символов (например, test ищет последовательность "test").
  • Метасимволов — специальных символов с особым значением (. * + ? ^ $ [] () {} | \).
  • Модификаторов — флагов, меняющих поведение поиска (i — регистронезависимый, s — точка включает перенос строки, m — многострочный режим).

Ключевые функции PCRE в PHP

1. preg_match() — поиск первого совпадения

Используется для проверки соответствия строки шаблону. Возвращает 1 при успехе, 0 — если нет совпадений.

$pattern = '/^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-z]{2,}$/';
$email = 'user@example.com';
if (preg_match($pattern, $email)) {
    echo "Email валиден.";
}

2. preg_match_all() — поиск всех совпадений

Находит все вхождения шаблона в строку и сохраняет их в массив.

$text = "Цены: 100 руб, 200 руб, 300 руб";
$pattern = '/\d+/';
preg_match_all($pattern, $text, $matches);
print_r($matches[0]); // Array ( [0] => 100 [1] => 200 [2] => 300 )

3. preg_replace() — замена по шаблону

Заменяет все совпадения с шаблоном на указанную строку или результат callback-функции.

$text = "Сегодня 2023-12-01";
$pattern = '/(\d{4})-(\d{2})-(\d{2})/';
$replacement = '$3.$2.$1';
echo preg_replace($pattern, $replacement, $text); // 01.12.2023

4. preg_split() — разделение строки по шаблону

Аналог explode(), но с использованием regex для разделителя.

$text = "Яблоко,Апельсин;Банан Груша";
$pattern = '/[,;\s]+/';
$fruits = preg_split($pattern, $text);
print_r($fruits); // Array ( [0] => Яблоко [1] => Апельсин [2] => Банан [3] => Груша )

5. preg_quote() — экранирование спецсимволов

Полезно для динамического создания шаблонов из пользовательского ввода.

$userInput = 'file.txt?';
$pattern = '/^' . preg_quote($userInput, '/') . '/';

Синтаксис шаблонов и модификаторы

Шаблон заключается в разделители (чаще /), после которых идут модификаторы:

// Пример с модификаторами
$pattern = '/тест/i'; // 'i' — игнорирует регистр
$text = "Это ТЕСТовая строка";
preg_match($pattern, $text, $matches); // Найдёт "ТЕСТ"

Группы захвата и обратные ссылки

Круглые скобки () создают группы захвата, к которым можно обращаться по индексу ($1, $2) или имени (с использованием синтаксиса (?P<name>...)).

$pattern = '/(\d{2})\.(\d{2})\.(\d{4})/';
$date = "Дата: 25.12.2023";
preg_match($pattern, $date, $matches);
echo "День: " . $matches[1]; // День: 25

Особенности работы движка PCRE

  • Компиляция шаблона — при первом использовании regex компилируется во внутреннее представление. Для повторного использования можно применить модификатор S для оптимизации или preg_pattern_cache.
  • Жадные и ленивые квантификаторы — по умолчанию * и + «жадные» (захватывают максимум символов). Добавление ? делает их ленивыми: .*?.
  • Ограничение backtracking — в PHP есть лимит на возвраты движка (pcre.backtrack_limit), что предотвращает «зависания» на сложных шаблонах.

Практические примеры использования

// Валидация номера телефона
$phonePattern = '/^\+7\s?\(\d{3}\)\s?\d{3}-\d{2}-\d{2}$/';
$phone = "+7 (912) 345-67-89";
if (preg_match($phonePattern, $phone)) {
    echo "Номер корректен.";
}

// Извлечение хештегов из текста
$text = "Погода #солнечно, #отпуск2024!";
$hashtagPattern = '/#([a-zA-Zа-яА-Я0-9_]+)/u'; // 'u' для UTF-8
preg_match_all($hashtagPattern, $text, $hashtags);
print_r($hashtags[1]); // Array ( [0] => солнечно [1] => отпуск2024 )

Производительность и лучшие практики

  1. Избегайте катастрофического backtracking — упрощайте сложные шаблоны.
  2. Используйте атомарные группы (?>...) для предотвращения ненужных возвратов.
  3. Кэшируйте скомпилированные шаблоны при многократном использовании.
  4. Предпочитайте простые строковые функции (strpos(), str_replace()) если regex избыточен.
  5. Тестируйте шаблоны на граничных случаях и используйте онлайн-тестеры (regex101.com).

Регулярные выражения в PHP — это инструмент, требующий баланса между мощью и сложностью. Правильное их применение значительно упрощает обработку текста, но важно помнить о производительности и читаемости кода.