W3docs

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

PHP — мощный серверный язык сценариев с поддержкой регулярных выражений PCRE для поиска, валидации и обработки строк.

Регулярное выражение (regex) — это шаблон, описывающий множество строк. В PHP регулярные выражения позволяют искать текст, проверять ввод, извлекать данные и преобразовывать строки, используя значительно меньше кода, чем при посимвольной обработке вручную. В этой главе рассматриваются синтаксис, функции preg_ и наиболее полезные продвинутые техники с примерами, которые можно запустить.

Что такое регулярные выражения

Регулярное выражение — это последовательность символов, определяющая поисковый шаблон. Вместо сопоставления с одной фиксированной строкой шаблон может описывать целое семейство строк: «любая цифра», «одна или более букв», «строка вида email» и т. д. Это делает regex идеальным инструментом для:

  • Проверки пользовательского ввода (email-адреса, номера телефонов, почтовые индексы).
  • Поиска подстрок, которые соответствуют некоторому виду, а не конкретному значению.
  • Извлечения данных — номеров заказов, дат или URL из произвольного текста.
  • Замены и разбиения текста по шаблону.

PHP использует PCRE (Perl-Compatible Regular Expressions), поэтому синтаксис шаблонов совпадает с Perl, JavaScript и большинством других современных языков.

Как работают регулярные выражения в PHP

В PHP регулярные выражения обрабатываются семейством функций preg_. Каждая из них принимает шаблон в качестве первого аргумента и выполняет разную операцию.

Основные функции preg_

ФункцияОписание
preg_match()Ищет первое совпадение. Возвращает 1 при совпадении, 0 при отсутствии совпадения, false при ошибке
preg_match_all()Находит все совпадения. Возвращает количество найденных полных совпадений
preg_replace()Заменяет каждое совпадение строкой замены
preg_split()Разбивает строку на массив, используя шаблон в качестве разделителя
preg_quote()Экранирует символы, имеющие особое значение в шаблоне

Распространённая ловушка: preg_match() возвращает 0 (ложное значение) при отсутствии совпадения и false при ошибке (например, при некорректном шаблоне). Используйте оператор ===, когда нужно различить эти два случая.

Основы регулярных выражений PHP

Шаблон в PHP — это строка, в которой тело шаблона заключено в разделители (обычно /), за которыми могут следовать модификаторы:

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

/pattern/modifiers

Где pattern — последовательность символов для сопоставления, а modifiers — необязательные буквы, изменяющие поведение шаблона. Наиболее часто используемые модификаторы в PHP:

  • i: Сопоставление без учёта регистра (/php/i совпадает с PHP, Php, php).
  • m: Многострочный режим — ^ и $ совпадают в начале/конце каждой строки, а не всей строки целиком.
  • s: Режим «точка совпадает со всем» — . также совпадает с символами новой строки.
  • u: Трактовать шаблон и исходную строку как UTF-8. Используйте это всякий раз, когда текст может содержать не-ASCII-символы.

Основные строительные блоки шаблонов

Внутри самого шаблона несколько метасимволов выполняют основную работу:

ТокенЗначение
\d \w \sЦифра, словесный символ, пробельный символ
.Любой одиночный символ (кроме новой строки, если не задан s)
+ * ?Один и более, ноль и более, ноль или один из предшествующего токена
{2,4}От 2 до 4 повторений
^ $Начало и конец строки (или строки в режиме m)
[abc]Класс символов — любой один из a, b или c
(...)Захватывающая группа
|Альтернация — совпадение с шаблоном с любой стороны

Регулярное выражение PHP для замены текста

php— editable, runs on the server

Использование регулярных выражений PHP для проверки пользовательского ввода

Одним из наиболее распространённых применений регулярных выражений в PHP является проверка пользовательского ввода. Например, с помощью регулярного выражения можно убедиться, что введённый пользователем email-адрес имеет правильный формат. Следующий код демонстрирует, как это можно сделать:

Регулярное выражение PHP для проверки правильности формата введённого пользователем email-адреса

php— editable, runs on the server

Примечание: хотя это регулярное выражение подходит для базовой проверки, PHP предоставляет встроенную функцию filter_var($email, FILTER_VALIDATE_EMAIL) для более надёжной валидации email согласно RFC. Для полных рабочих процессов с формами см. Проверка форм PHP.

Поиск всех совпадений

В то время как preg_match() останавливается на первом совпадении, preg_match_all() собирает все совпадения в массив. Этот инструмент используется для извлечения повторяющихся данных — например, каждого слова, числа или тега в строке.

Извлечь все числа из строки

<?php

$text = "Room 12, floor 3, building 7";
$count = preg_match_all("/\d+/", $text, $matches);

echo $count;                    // Outputs: 3
print_r($matches[0]);           // Outputs: Array ( [0] => 12 [1] => 3 [2] => 7 )

?>

Разбиение строк

preg_split() разбивает строку на массив, используя шаблон в качестве разделителя. В отличие от explode(), разделитель может варьироваться — здесь мы разбиваем по любому сочетанию запятых и пробелов:

<?php

$csv = "apple, banana,  cherry";
$fruits = preg_split("/[\s,]+/", $csv);

print_r($fruits);
// Outputs: Array ( [0] => apple [1] => banana [2] => cherry )

?>

Продвинутые техники работы с регулярными выражениями PHP

Освоив основы, вы сможете использовать эти техники для написания выразительных и точных шаблонов.

Захватывающие группы

Скобки (...) захватывают часть совпадения, чтобы вы могли прочитать её из массива $matches. Индекс 0 содержит всё совпадение; индексы 1 и выше содержат каждую группу.

php— editable, runs on the server

Именованные группы

(?<name>...) присваивает группе читаемую метку, чтобы можно было извлекать значения по имени, а не по числовому индексу — это гораздо понятнее для дат, цен и других структурированных данных.

<?php

$date = "2023-10-01";
preg_match("/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/", $date, $m);

echo $m["year"];   // Outputs: 2023
echo $m["month"];  // Outputs: 10

?>

Альтернация

Оператор | совпадает с одним шаблоном или другим. Пример ниже совпадает с тем животным, которое встречается первым:

<?php

preg_match("/cat|dog|bird/", "I love cats", $m);
echo $m[0]; // Outputs: cat

?>

Другие строительные блоки

  • Незахватывающие группы(?:...) группируют токены вместе (например, для применения квантификатора) без сохранения совпадения, что позволяет сохранить массив $matches чистым.
  • Предвидение / заглядывание назад(?=...), (?!...), (?<=...), (?<!...) проверяют совпадение на основе того, что идёт до или после позиции, не потребляя её.
  • Квантификаторы{n}, {n,} и {n,m} совпадают с точным количеством или диапазоном повторений, например \d{4} для ровно четырёх цифр.

Когда нужно сопоставить предоставленный пользователем текст буквально внутри шаблона, предварительно пропустите его через preg_quote(), чтобы такие символы, как . или *, были экранированы, а не обрабатывались как метасимволы.

Связанные темы

Заключение

Регулярные выражения PHP — мощный инструмент, помогающий решать широкий круг задач. Будь то проверка пользовательского ввода, поиск в тексте или сложные манипуляции со строками — регулярные выражения являются неотъемлемой частью арсенала PHP-разработчика.

Практика

Практика
Каковы варианты использования регулярных выражений в PHP, указанные в связанной статье?
Каковы варианты использования регулярных выражений в PHP, указанные в связанной статье?
Was this page helpful?