English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP Основной Урок

PHP Уровеньный Урок

PHP & MySQL

PHP Референс Мануал

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

В этом руководстве вы узнаете, как работают регулярные выражения, и как использовать их для эффективного выполнения шаблонного соответствия в PHP.

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

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

PHP (версия 5.3 и выше) поддерживает регулярные выражения стиля Perl через серию функций preg_. Почему использовать регулярные выражения стиля Perl? Потому что Perl (Практический язык для извлечения и отчетностиЭто первое из основных языков программирования, которые предоставляют интегрированную поддержку регулярным выражениям, и оно известно своей мощной поддержкой регулярных выражений и非凡ыми функциями обработки и манипуляции текстом.

Прежде чем углубиться в мир регулярных выражений, давайте сначала кратко介绍一下常用的 функции内置模式 соответствия PHP.

ФункцияОписание
preg_match()Выполнение соответствия регулярного выражения.
preg_match_all()Выполнение глобального соответствия регулярного выражения.
preg_replace()Выполнение поиска и замены регулярного выражения.
preg_grep()Возврат элементов массива, соответствующих шаблону.
preg_split()Использование регулярных выражений для разделения строки на подстроки.
preg_quote()Цитирование регулярных выражений, найденных в строке.

Примечание: Функция preg_match() в PHP останавливает поиск после нахождения первого соответствия, а функция preg_match_all() продолжает поиск до конца строки и находит все возможные соответствия, а не останавливается на первом соответствии.

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

Грамматика регулярных выражений включает использование специальных символов (не путайте сСпециальные символы HTMLВ регулярных выражениях имеют особое значение следующие символы: . * ? + [ ] ( ) { } ^ $ | \. Каждый раз, когда вы хотите использовать их в прямом смысле, вам нужно добавить обратную косую черту. Например, чтобы соответствовать символу «.», нужно написать \. Все другие символы автоматическиadopt их буквальное значение.

Следующие разделы описывают различные опции, доступные для создания шаблонов:

Классы символов

Квадратные скобки вокруг шаблона называются классами символов, например [ABC]. Классы символов всегда соответствуют одному символу из указанного списка, что означает, что выражение [abc] соответствует только символам a, b или c.

Вы также можете определить отрицательный класс символов, чтобы соответствовать любому символу, кроме тех, которые указаны в скобках. Отрицательный класс символов определяется, добавляя символ (^) сразу после левой скобки, например, [^abc].

Вы также можете определить диапазон символов, используя дефис (-) в классе символов (например, [0-9]). Давайте посмотрим на примеры классов символов:

Регулярное выражениеЧто она может сделать
[abc]Соответствие любому из символов a, b или c.
[^abc]Соответствие любому символу, кроме a, b и c.
[a-z]Соответствие любому символу от маленькой буквы a до маленькой буквы z.
[A-Z]Соответствие любому символу от большой буквы A до большой буквы Z.
[a-Z]Соответствие любому символу от маленькой буквы a до большой буквы Z.
[0-9]Соответствие одному числу между 0 и 9.
[a-z0-9]Соответствие одному символу между a и z или между 0 и 9.

Этот пример покажет вам, как использовать регулярные выражения и функцию preg_match() в PHP для поиска шаблонов в строке:

<?php
$pattern = "/ca[kf]e/";
$text = "He was eating cake in the cafe.";
if(preg_match($pattern, $text)){}}
    echo "Match found!";
}
    echo "Match not found.";
}
?>
тестировать‹/›

Таким же образом, можно использовать функцию preg_match_all() для поиска всех совпадений в строке:

<?php
$pattern = "/ca[kf]e/";
$text = "He was eating cake in the cafe.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . ' matches were found.';
?>
тестировать‹/›

Совет:Регулярные выражения не являются эксклюзивными для PHP. Языки, такие как Java, Perl, Python и другие, используют те же символы для поиска текстовых шаблонов.

Предопределенные классы символов

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

Краткие обозначенияЧто она может сделать
.Совпадает с любым символом, кроме перевода строки \n.
\dСовпадает с любым символом числа. Эквивалентно [0-9].
\DСовпадает с любым несимвольным символом. Эквивалентно [^0-9]
\sСовпадает с любым пробельным символом (пробел, табуляция, перевод строки или carriage return). Эквивалентно [\t\n\r]
\SСовпадает с любым несимвольным символом. Эквивалентно [^\t\n\r]
\wСовпадает с любым словесным символом (определенным как a до z, A до Z, 0 до 9 и подчеркивание). Эквивалентно [a-zA-Z_0-9]
\WСовпадает с любым несловным символом. Эквивалентно [^a-Za-Z_0-9]

Следующие примеры покажут, как использовать регулярные выражения и функцию preg_replace() в PHP для поиска и замены пробелов в строке с помощью тире:

<?php
$pattern = "/\s/";
$replacement = "-";
$text = "Earth revolves around\nthe\tSun";
//Замена пробелов, переводных знаков и табуляций
echo preg_replace($pattern, $replacement, $text);
echo "<br>";
//Только замена пробелов
echo str_replace(" ", "-", $text);
?>
тестировать‹/›

Повторяющиеся кванторы

В предыдущем разделе мы изучили, как по-разному совпадать с одним символом. Но что делать, если нужно совпадать с несколькими символами? Например, предположим, что нужно найти слово, содержащее одну или несколько инстанций буквы p, или слово, содержащее не менее двух p, и т.д. Здесь и начинают действовать кванторы. Используя кванторы, можно указать, сколько раз должен совпадать символ в регулярном выражении.

В таблице ниже перечислены различные методы квантования специфических шаблонов:

Регулярное выражениеЧто она может сделать
p+Соответствует одному или нескольким буквам p.
p*Соответствует нулю или нескольким вхождениям буквы p.
p?Соответствует нулю или одному вхождению буквы p.
p{2}Точное соответствие двум буквам p.
p{2,3}Соответствие не менее двум, но не более чем трем的出现 букв p.
p{2,}

Соответствие двум или более的出现 букв p.

p{,3}Максимальное соответствие трем出现 букв p

В следующем примере регулярное выражение будет использовать функцию PHP preg_split() для разделения строки на запятые, запятые последовательности, пробелы или их комбинации:

<?php
$pattern = "/[\s,]+/";
$text = "My favourite colors are red, green and blue";
$parts = preg_split($pattern, $text);
 
//Циклически проходить по массиву $parts и отображать подстроки
foreach($parts as $part){
    echo $part . "<br>";
}
?>
тестировать‹/›

Якорные позиции

В некоторых случаях вы хотите соответствовать в начале или конце строки, слова или строки. Для этого вы можете использовать якоря. Два наиболее часто используемых якоря - это символ вставки (^) для начала строки и символ доллара ($) для конца строки.

Регулярное выражениеЧто она может сделать
^pСоответствие с буквой p в начале строки.
p$Соответствие с буквой p в конце строки.

В следующем примере регулярное выражение будет использовать функцию PHP preg_grep() для отображения имен в массиве, начинающихся с буквы 'J':

<?php
$pattern = "/^J/";
$names = array("Jhon Carter", "Clark Kent", "John Rambo");
$matches = preg_grep($pattern, $names);
 
//Проходить по массиву $matches и отображать соответствующие имена
foreach($matches as $match){
    echo $match . "<br>";
}
?>
тестировать‹/›

Декораторы шаблона

Декораторы шаблона позволяют вам specify, как обрабатывать соответствие шаблона. Декораторы шаблона ставятся direkt nach dem регулярном выражении, например, если вы хотите искать шаблон не зависимо от регистра, вы можете использовать декоратор i, как показано ниже: /pattern/i. В таблице приведены некоторые из наиболее часто используемых декораторов шаблона.

ДекораторыЧто она может сделать
iСделать соответствие не зависимым от регистра.
mИзмените поведение ^ и $ для соответствия границам строки перевода (т.е. началу или концу строки в многострочном тексте), а не границам строки.
gВыполнить глобальное соответствие, то есть найти все соответствия.
oВычислять выражение только один раз.
sИзмените поведение '点' для соответствия всем символам, включая символы перевода строки.
xЭто позволяет использовать пробелы и комментарии в регулярных выражениях для поддержания их ясности.

Следующий пример покажет, как использовать модификатор i и функцию PHP preg_match_all() для выполнения не зависящего от регистра глобального поиска.

<?php
$pattern = '/color/i';
$text = 'Цвет красный более заметен, чем color blue в дневном свете.';
$matches = preg_match_all($pattern, $text, $array);
echo $matches . ' matches were found.';
?>
тестировать‹/›

Аналогично, следующий пример показывает, как использовать анкер ^ и модификатор m с функцией PHP preg_match_all() для соответствия в начале каждого строки многстрочного строки.

<?php
$pattern = '/^color/im';
$text = 'Цвет красный более заметен, чем \ncolor blue в дневном свете.';
$matches = preg_match_all($pattern, $text, $array);
echo $matches . ' matches were found.';
?>
тестировать‹/›

Границы слова

Символы границ слова (\b) могут помочь вам искать слова, начинающиеся и/или заканчивающиеся на шаблон. Например, регулярное выражение /\bcar/ соответствует словам, начинающимся на шаблон car, и соответствует cart, carrot или cartoon, но не соответствует oscar.

Аналогично, регулярное выражение /car\b/ соответствует словам, заканчивающимся на模式 car, и соответствует scar, oscar или supercar, но не соответствует cart. Также, /\bcar\b/ соответствует словам, начинающимся и заканчивающимся на слово car, и соответствует только слову car.

В следующем примере слова, начинающиеся на car, будут выделены жирным шрифтом:

<?php
$pattern = '/\bcar\w*/';
$replacement = '<b>$0</b>';
$text = 'Слова, начинающиеся на car: cart, carrot, cartoon. Слова, заканчивающиеся на car: scar, oscar, supercar.';
echo preg_replace($pattern, $replacement, $text);
?>
тестировать‹/›

Мы надеемся, что вы уже знаете основы регулярных выражений. Чтобы узнать, как использовать регулярные выражения для валидации данных форм, пожалуйста, посмотрите соответствующиеВалидация форм PHPруководство.