Регулярные выражения в PHP: preg_match, preg_replace и понятные примеры
Если вы ищете простое и практичное руководство по запросу «регулярные выражения в PHP», вы по адресу. Разберём ключевые функции PCRE: preg_match, preg_replace и preg_split, посмотрим на модификаторы, Unicode, жадность и оптимизацию. В конце — чек‑лист лучших практик и отладка ошибок.
Что такое регулярные выражения в PHP
Регулярное выражение (regex) — это шаблон для поиска и обработки текста. В PHP используется движок PCRE (Perl-Compatible Regular Expressions), а функции начинаются с preg_*.
Быстрый старт: preg_match
preg_match проверяет, соответствует ли строка шаблону, и может вернуть совпадения.
<?php
$pattern = '/^hello,s*(?[p{L} -]{2,})$/u';
$text = 'hello, Иван Петров';
if (preg_match($pattern, $text, $m)) {
echo "Привет, {$m['name']}!"; // Привет, Иван Петров!
}
Здесь:
^ и $ — якоря начала и конца строки;p{L} — любая буква Юникода (важен модификатор u);(?<name>...) делает код понятнее.Все вхождения: preg_match_all
<?php
$text = 'Хештеги: #php #regex #примеры';
$pattern = '/#(w+)/u';
preg_match_all($pattern, $text, $m);
print_r($m[1]); // [php, regex, примеры]
Замена: preg_replace
Частая задача — нормализовать данные. Например, очистим телефон до цифр и приведём к формату 7XXXXXXXXXX.
<?php
$raw = '+7 (999) 123-45-67';
$digits = preg_replace('/D+/', '', $raw); // 79991234567
$digits = preg_replace('/^8/', '7', $digits); // замена ведущей 8 на 7
$normalized = '7' . substr($digits, -10); // 7 + последние 10 цифр
echo $normalized; // 79991234567
Пример с группами и подстановками:
<?php
$text = 'Файл: report_2025-01-13.pdf';
$pattern = '/(?<yeard{4})-(?<monthd{2})-(?<dayd{2})/'; // опечатка исправим ниже
Будьте внимательны: именованные группы пишутся так (?<year>d{4}). Правильный вариант:
<?php
$pattern = '/(?<year>d{4})-(?<month>d{2})-(?<day>d{2})/';
$replaced = preg_replace($pattern, '${day}.${month}.${year}', $text);
echo $replaced; // Файл: report_13.01.2025.pdf
Разбиение строки: preg_split
<?php
$line = "яблоко, груша; сливаtперсик абрикос";
$parts = preg_split('/[s,;]+/u', $line, -1, PREG_SPLIT_NO_EMPTY);
print_r($parts); // [яблоко, груша, слива, персик, абрикос]
Модификаторы: u, i, m, s, x
^ и $ видят границы строк);<?php
$pattern = '/^привет$/miu';
$text = "ПриветnприветnПРИВЕТ";
preg_match_all($pattern, $text, $m);
print_r($m[0]); // [привет, ПРИВЕТ]
Жадность и ленивость квантификаторов
По умолчанию квантификаторы жадные. Добавьте ?, чтобы сделать их ленивыми.
<?php
$text = '<b>one</b><b>two</b>';
preg_match_all('/<b>.*</b>/', $text, $greedy);
preg_match_all('/<b>.*?</b>/', $text, $lazy);
print_r($greedy[0]); // ['<b>one</b><b>two</b>']
print_r($lazy[0]); // ['<b>one</b>', '<b>two</b>']
Именованные группы и просмотр вперёд
<?php
$pattern = '/^(?=.{8,})(?=.*[A-Z])(?=.*d)[A-Za-zd]+$/';
$ok = preg_match($pattern, 'Php2025'); // 0 — нет заглавной буквы и длины недостаточно
$ok = preg_match($pattern, 'StrongPass1'); // 1 — соответствует
Здесь «заглядывания» (?=...) проверяют условия без потребления символов.
Производительность и безопасность
/(a+)+$/ на длинных строках.<?php
ini_set('pcre.backtrack_limit', '1000000');
ini_set('pcre.recursion_limit', '100000');
$subject = str_repeat('a', 100000);
preg_match('/(a+)+$/', $subject);
switch (preg_last_error()) {
case PREG_BACKTRACK_LIMIT_ERROR:
echo 'Превышен backtrack_limit';
break;
case PREG_RECURSION_LIMIT_ERROR:
echo 'Превышен recursion_limit';
break;
case PREG_NO_ERROR:
echo 'Ошибок нет';
}
Для оптимизации используйте «жадные» приёмы безопасно: позитивные квантификаторы (d++) и атомарные группы (?>...) уменьшают бэктрекинг.
<?php
$ok = preg_match('/d++[a-z]/i', '1234A'); // быстрее, чем /d+[a-z]/
$ok = preg_match('/(?>d+)[a-z]/i', '1234A'); // атомарная группа
Типичные ошибки и отладка
u для русского текста — классы вроде w и .* ведут себя странно./ в шаблоне, экранируйте </b> или выберите другой разделитель, например #...#.x и документируйте.<?php
$pattern = '# ^ (?<user>[p{L}0-9_.-]{3,16}) @ (?<host>[p{L}0-9.-]+.[a-z]{2,}) $ #ixu';
$emailLike = 'user.name@пример.рф';
var_dump((bool)preg_match($pattern, $emailLike));
Небольшая шпаргалка рецептов
/^d+$//^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i'~https?://[w.-]+(?:/[w-._~:?#[]@!$&'()*+,;=]*)?~iu'<?php
$title = 'Лучшие практики PHP: Регулярки и Unicode!';
$slug = mb_strtolower($title);
$slug = preg_replace('/[^p{L}p{Nd}]+/u', '-', $slug);
$slug = trim(preg_replace('/-+/', '-', $slug), '-');
echo $slug; // luchshie-praktiki-php-regulyarki-i-unicode
Как быстро тестировать шаблоны
Можно писать мини‑скрипт или даже однострочник через CLI:
php -r "var_export(preg_match('/^d+$/', '12345'));"
Итоги
Теперь вы знаете, как использовать регулярные выражения в PHP для поиска, проверки и преобразования строк: preg_match и preg_match_all для поиска, preg_replace для замены и preg_split для разбиения. Обращайте внимание на модификаторы (u,i,m,s,x), контролируйте жадность квантификаторов и следите за производительностью.
Хотите системно прокачать PHP и базу данных на проектах «с нуля до продакшена»? Посмотрите программу и запишитесь на практический курс «PHP и MySQL с Нуля до Гуру 3.0» — отличный способ закрепить знания о регулярках и не только.




