🧱 Суть

Регулярные выражения (Regular Expressions, RegExp) – это специальный язык шаблонов для поиска, проверки и изменения строк.

Они позволяют описать правило:

«Найди текст, который соответствует этому шаблону»

Например:

  • проверить формат email
  • найти все числа в тексте
  • заменить часть строки
  • проверить пароль
  • найти определённые символы

В PHP регулярные выражения работают через семейство функций:

preg_*

Они используют движок PCRE (Perl Compatible Regular Expressions).

📦 Проблема

Обычные строковые функции не всегда удобны.

Например:

Проверить email:

$email = "user@example.com";

Можно использовать:

strpos($email, '@');

Но это проверит только наличие символа @.

Нельзя нормально проверить:

  • структуру адреса
  • длину частей
  • допустимые символы

Для сложных правил нужны регулярные выражения.

💻 Код

Синтаксис регулярных выражений

В PHP шаблон обычно записывается между разделителями:

/pattern/

Пример:

/hello/

Найдёт:

hello world

Разделители могут быть разными:

#pattern#
 
~pattern~

Чаще всего используют:

/pattern/

preg_match() – поиск совпадения

Основная функция для проверки строки.

Синтаксис:

preg_match(
    $pattern,
    $subject
);

Пример:

$result = preg_match(
    '/php/',
    'I love php'
);

Вернёт:

1

Если совпадение найдено.

Если нет:

0

Проверка числа

preg_match(
    '/123/',
    'Order 123'
);

Найдёт:

Order 123

Метасимволы

Регулярные выражения имеют специальные символы.

Любой символ

.

/c.t/

Найдёт:

cat
cot
cut

Любая цифра

\d

/\d/

Найдёт:

123

Любая буква/цифра/подчёркивание

\w

/\w+/

Найдёт:

user123

Пробельный символ

\s

/\s/

Найдёт:

  • пробел
  • перенос строки
  • таб

Квантификаторы

Определяют количество повторений.

*

0 или больше:

/a*/

Совпадёт:

""
"a"
"aaa"

+

1 или больше:

/a+/

Совпадёт:

a
aaa

?

0 или 1:

/a?/

{n}

Точное количество:

/\d{4}/

Найдёт:

2026

{min,max}

Диапазон:

/\d{2,4}/

Найдёт:

12
123
1234

Якоря начала и конца

Начало строки

^

Пример:

/^Hello/

Найдёт:

Hello world

Но не:

Say Hello

Конец строки

$

Пример:

/world$/

Найдёт:

Hello world

Группы и альтернативы

Группа

(user)

Позволяет объединить части выражения.

Или

(cat|dog)

Найдёт:

cat

или:

dog

preg_match() с группами

Можно получить найденные части:

$text = "User: Alex";
 
preg_match(
    '/User: (\w+)/',
    $text,
    $matches
);

Результат:

[
    "User: Alex",
    "Alex"
]

Группа в скобках сохранилась.

preg_match_all() – найти все совпадения

Используется, когда нужно получить все найденные элементы.

Пример:

$text = "Numbers: 10 20 30";
 
preg_match_all(
    '/\d+/',
    $text,
    $matches
);

Результат:

[
    [
        "10",
        "20",
        "30"
    ]
]

preg_replace() – замена по шаблону

Синтаксис:

preg_replace(
    $pattern,
    $replacement,
    $subject
);

Пример:

$text = "Hello 123";
 
$result = preg_replace(
    '/\d+/',
    '',
    $text
);

Результат:

Hello

Все числа удалены.

Замена нескольких пробелов

$text = preg_replace(
    '/\s+/',
    ' ',
    $text
);

Было:

Hello     world

Стало:

Hello world

preg_split() – разделение строки

Работает как explode(), но по шаблону.
Пример:

$result = preg_split(
    '/[\s,]+/',
    'one,two three'
);

Результат:

[
    "one",
    "two",
    "three"
]

Флаги регулярных выражений

После закрывающего / можно добавлять модификаторы.

i – игнорировать регистр

/php/i

Найдёт:

PHP
Php
php

m – многострочный режим

Используется с:

^
$

u – UTF-8

Очень важен для русского языка:

'/[а-я]+/ui'

Без u кириллица может работать некорректно.

Примеры

Проверка email

$email = "user@example.com";
 
if (
    preg_match(
        '/^[\w.+-]+@[\w.-]+\.[a-z]{2,}$/i',
        $email
    )
) {
    echo "Valid";
}

Проверяется:

  • начало строки
  • имя пользователя
  • @
  • домен
  • зона

Проверка пароля

Требования:

  • минимум 8 символов
  • есть цифра
  • есть буква
$password = "Test1234";
 
$isValid = preg_match(
    '/^(?=.*[A-Za-z])(?=.*\d).{8,}$/',
    $password
);

Частые ошибки

Использовать regex там, где достаточно обычных функций

Плохо:

preg_match('/hello/', $text);

Если нужно просто найти слово:

str_contains($text, 'hello');

будет лучше.

Забывать про экранирование

Специальные символы:

. * + ? ^ $ ( ) [ ] { } |

имеют значение.

Если нужен обычный символ:

\.

Не использовать u для русского текста

Плохо:

/[а-я]+/

Лучше:

/[а-я]+/ui

Делать слишком сложные регулярки

Огромные выражения:

^(?=...)

сложно поддерживать.

Лучше:

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

🎯 Вывод

  • Регулярные выражения используются для поиска и обработки текста
  • В PHP они работают через функции preg_*
  • preg_match() – найти совпадение
  • preg_match_all() – найти все совпадения
  • preg_replace() – заменить по шаблону
  • preg_split() – разделить строку по шаблону
  • ^ и $ проверяют начало и конец строки
  • +, *, {} управляют количеством повторений
  • () создают группы
  • u нужен для корректной работы с UTF-8
  • Не стоит использовать regex там, где достаточно обычных функций строк

🔗 Связано