PHP використовує бібліотеку PCRE: функції preg_* приймають шаблон з роздільниками (/.../, ~...~, #...#) і модифікаторами після них.
preg_match('/^\d{4}-\d{2}-\d{2}$/', $date); // 1, 0 або false при помилці
preg_match('/(?<year>\d{4})-(?<month>\d{2})/', $s, $m); // $m['year'], $m['month']
preg_match_all('/#(\w+)/u', $text, $matches); // усі хештеги
preg_replace('/\s+/', ' ', $text); // стиснути пробіли
preg_replace_callback('/\d+/', fn ($m) => $m[0] * 2, $s);
preg_split('/[,;]\s*/', $list);
Модифікатор u вмикає режим UTF-8:
- шаблон і рядок обробляються як UTF-8, а не як байти;
.відповідає одному символу, а не байту;- працюють Unicode-класи:
\p{L}(будь-яка літера),\p{Lu}(велика),\p{Cyrillic}.
Без u шаблон /^.{3}$/ для «кіт» не спрацює (там 6 байтів), а \w не вважає кирилицю літерами.
preg_match('/^[\p{L}\s\'-]+$/u', "Мар'яна Іваненко"); // 1
Інші корисні модифікатори: i - без урахування регістру, m - ^/$ для кожного рядка, s - . охоплює й переведення рядка, x - пробіли й коментарі в шаблоні для читабельності.
Пастки:
- Помилка ≠ збіг:
preg_matchповертаєfalseпри помилці (зламаний UTF-8 у рядку зu, перевищення ліміту backtracking). Причина - уpreg_last_error_msg(). - Катастрофічний backtracking: шаблони на кшталт
(a+)+$на зловмисному введенні виконуються експоненційно довго (ReDoS). Уникайте вкладених квантифікаторів. - Екранування введення користувача в шаблоні - через
preg_quote($input, '/'). - Для простих випадків швидші й зрозуміліші
str_contains,str_starts_with,str_replace.