Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Регулярные выражения

Регулярное выражение — это шаблон для поиска в тексте. Им проверяют, похожа ли строка на телефон или почту, достают числа из текста, заменяют фрагменты по правилу. В 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() — она быстрее и понятнее.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.