Регулярные выражения 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 для проверки пользовательского ввода
Одним из наиболее распространённых применений регулярных выражений в PHP является проверка пользовательского ввода. Например, с помощью регулярного выражения можно убедиться, что введённый пользователем email-адрес имеет правильный формат. Следующий код демонстрирует, как это можно сделать:
Регулярное выражение PHP для проверки правильности формата введённого пользователем email-адреса
Примечание: хотя это регулярное выражение подходит для базовой проверки, 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 и выше содержат каждую группу.
Именованные группы
(?<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 RegEx (полное руководство) — более подробное описание синтаксиса PCRE в PHP.
- Строки PHP — строковые функции без regex, которые дополняют регулярные выражения.
- Проверка форм PHP — применение шаблонов к реальному вводу форм.
Заключение
Регулярные выражения PHP — мощный инструмент, помогающий решать широкий круг задач. Будь то проверка пользовательского ввода, поиск в тексте или сложные манипуляции со строками — регулярные выражения являются неотъемлемой частью арсенала PHP-разработчика.