Регулярные выражения
Регулярное выражение — это шаблон для поиска в тексте. Им проверяют, похожа ли строка на телефон или почту, достают числа из текста, заменяют фрагменты по правилу. В PHP с шаблонами работают функции, имена которых начинаются с preg_.
Проверка по шаблону
preg_match() возвращает 1, если шаблон найден, и 0, если нет. Шаблон пишут между косыми чертами:
<?php
echo preg_match('/кот/', 'Мой кот спит'), "\n"; // 1
echo preg_match('/пёс/', 'Мой кот спит'); // 0Буква u после шаблона включает поддержку кириллицы, i — поиск без учёта регистра: /кот/ui.
Обозначения
| Запись | Что означает |
|---|---|
\d | Цифра |
\w | Буква, цифра или подчёркивание |
\s | Пробельный символ |
. | Любой символ |
[abc] | Один из перечисленных символов |
+ | Один раз или больше |
* | Ноль раз или больше |
? | Ноль или один раз |
{3} | Ровно три раза |
^ и $ | Начало и конец строки |
Проверка формата
Знаки ^ и $ требуют, чтобы шаблону соответствовала вся строка, а не её часть:
<?php
$pattern = '/^\d{4}-\d{2}-\d{2}$/';
echo preg_match($pattern, '2025-01-30'), "\n"; // 1
echo preg_match($pattern, '30.01.2025'); // 0Группы
Часть шаблона в круглых скобках — группа. Найденные группы попадают в массив, который передают третьим аргументом:
<?php
preg_match('/(\d+) руб/u', 'Цена: 250 руб.', $matches);
echo $matches[0], "\n"; // 250 руб
echo $matches[1]; // 250Элемент с индексом 0 — всё совпадение, дальше идут группы по порядку.
Все совпадения
preg_match_all() находит не первое совпадение, а все:
<?php
preg_match_all('/\d+/', 'Заказ 15, товаров 3, сумма 4200', $matches);
echo implode(', ', $matches[0]); // 15, 3, 4200Замена
preg_replace() заменяет всё, что подошло под шаблон:
<?php
echo preg_replace('/\s+/', ' ', 'много лишних пробелов'), "\n";
echo preg_replace('/\D/', '', '+7 (900) 123-45-67');Первая строка превращает группы пробелов в один пробел, вторая оставляет в телефоне только цифры: 79001234567.
Разбиение
preg_split() делит строку по шаблону — когда разделитель не один:
<?php
$parts = preg_split('/[,;]\s*/', 'чай, кофе; сок');
echo count($parts), ' ', $parts[2]; // 3 сокЧастая ошибка
Не пишите сложные шаблоны там, где есть готовая проверка. Адрес почты и ссылку надёжнее проверять функцией filter_var():
<?php
var_dump(filter_var('anna@example.com', FILTER_VALIDATE_EMAIL) !== false); // bool(true)
var_dump(filter_var('не почта', FILTER_VALIDATE_EMAIL) !== false); // bool(false)А для простого поиска подстроки хватит str_contains() — она быстрее и понятнее.