PHP regexp — это мощный алгоритм сопоставления шаблонов, которое может быть выполнено в одном выражении. Регулярные выражения PHP используют арифметические операторы (такие как +, -, ^ ) для создания сложных выражений.
Для чего используются регулярные выражения:
- Регулярные выражения упрощают идентификацию строковых данных путем вызова одной функции. Это экономит время при составлении кода;
- При проверке введенных пользователем данных, таких как адрес электронной почты, домен сайта, номер телефона, IP-адрес ;
- Выделение ключевых слов в результатах поиска;
- Регулярные выражения могут использоваться для идентификации тегов и их замены.
Регулярные выражения в PHP
PHP содержит встроенные функции, которые позволяют работать с регулярными выражениями. Теперь рассмотрим часто используемые функции регулярных выражений PHP .
- preg_match — используется для выполнения сопоставления с шаблоном строки. Она возвращает true , если совпадение найдено, и false , если совпадение не найдено;
- preg_split — используется для разбивки строки по шаблону, результат возвращается в виде числового массива;
- preg_replace – используется для поиска по шаблону и замены на указанную строку.
Ниже приведен синтаксис функций регулярных выражений, таких как preg_match , preg_split или PHP regexp replace :
«имя_функции»
— это либо preg_match
, либо preg_split
, либо preg_replace
.
«/…/»
— косые черты обозначают начало и конец регулярного выражения.
«‘/шаблон/"»
— шаблон, который нам нужно сопоставить.
«объект»
— строка, с которой нужно сопоставлять шаблон.
Теперь рассмотрим практические примеры использования упомянутых выше функций.
Preg_match
В первом примере функция preg_match используется для выполнения простого сопоставления шаблоном для слова guru в заданном URL-адресе .
В приведенном ниже коде показан вариант реализации данного примера:
Рассмотрим ту часть кода, которая отвечает за вывод «preg_match (‘/ guru /’, $ my_url)» .
«preg_match(…)»
— функция PHP match regexp
.
«‘/Guru/"»
— шаблон регулярного выражения.
«$My_url»
— переменная, содержащая текст, с которым нужно сопоставить шаблон.
Preg_split
Рассмотрим другой пример, в котором используется функция preg_split .
Мы возьмем фразу и разобьем ее на массив; шаблон предназначен для поиска единичного пробела:
Preg_replace
Рассмотрим функцию preg_replace , которая выполняет сопоставление с шаблоном и заменяет найденный результат другой строкой.
Приведенный ниже код ищет в строке слово guru . Он заменяет его кодом css , который задает цвет фона:
Guru", $text); echo $text; ?>
Метасимволы
В приведенных выше примерах использовались простые шаблоны. Метасимволы позволяют выполнять более сложные сопоставления шаблонов PHP regexp , такие как проверка адреса электронной почты. Рассмотрим часто используемые метасимволы.
Метасимвол | Описание | Пример |
. | Обозначает любой единичный символ, кроме символа новой строки. | /./ — все, что содержит один символ. |
^ | Обозначает начало строки, не включая символ /. | /^PH/ — любая строка, которая начинается с PH. |
$ | Обозначает шаблон в конце строки. | /com$/ — guru99.com,yahoo.com и т.д. |
* | Обозначает любое количество символов, ноль или больше. | /com*/ — computer, communication и т.д. |
+ | Требуется вхождение перед метасимволом символа (ов) хотя бы один раз. | /yah+oo/ — yahoo. |
Символ экранирования. | /yahoo+.com/ — воспринимает точку, как дословное значение. | |
[…] | Класс символов. | // — abc. |
a-z | Обозначает строчные буквы. | /a-z/ — cool, happy и т.д. |
A-Z | Обозначает заглавные буквы. | /A-Z/ — WHAT, HOW, WHY и т.д. |
0-9 | Обозначает любые цифры от 0 до 9. | /0-4/ — 0,1,2,3,4. |
Теперь рассмотрим сложный PHP regexp пример, в котором проверяется валидность адреса электронной почты:
Результат: адрес электронной почты [email protected] является валидным.
Пояснение шаблона «+@+.{2,5}$/] «
«‘/…/"»
начинает и завершает регулярное выражение.
«^»
соответствует любым буквам в нижнем или верхнем регистре, цифрам от 0 до 9 и точкам, подчеркиваниям или тире.
«+@»
соответствует символу @
, за которым следуют буквы в нижнем или верхнем регистре, цифры от 0 до 9 или дефисы.
«+.{2,5}$/»
указывает точку, используя обратную косую черту, затем должны следовать любые буквы в нижнем или верхнем регистре, количество символов в конце строки должно быть от 2 до 5.
Описание функции:
Функция preg_replace ищет совпадения регулярного выражения (pattern ) с данными в строке (subject) и заменяет их на данные находящиеся в replacement .
Аргумент |
Описание |
|
pattern |
Обязательный аргумент. Регулярное выражение (шаблон поиска) |
string, array |
replacement |
Обязательный аргумент. Строка или массив с данными используемыми для замены данных в subject Также для ссылок можно использовать конструкцию вида \${1} равнозначную \$1, это конструкция используется если после ссылки идет сразу цифра (\${1}1). |
string, array |
subject | Обязательный аргумент. Строка или массив с данными которые будут заменены. | string, array |
limit | Необязательный аргумент. Максимально количество замен. По умолчанию равно -1 (не ограниченно) |
int |
count | Необязательный аргумент. Переменная в которой содержится количество произведенных замен. |
int |
Функция preg_replace() может использоваться с модификатором / e. При наличии этого модификатора параметр replacement интерпретируется как PHP-код и затем используется для замены.
Регулярные выражения
Отдельно следует остановится на регулярных выражениях, без представления о которых довольно трудно (если вообще возможно) разобраться с работой функции preg_replace().
Достаточно хорошо описание регулярных выражений приводится на wikipedia.org , основные моменты применения регулярных выражений также описаны
Примеры:
Пример 1:
В этом примере заменяем все цифры помещенные в скобки на звездочки.Пример 2:
В этом примере заменяем строку соответствующую всему шаблону, данными соответствующими первой подмаске по ссылке \$1. Другими словами "have 3 apples", соответствующие "/(\w+) (\d+) (\w+)/", будет заменено на "have", соответствующее (\w+).
Пример 3:
В этом примере показано, что произойдет если в качестве pattern и replacement использовать массивы.
Пример 4:
В этом примере показано, что произойдет если в качестве pattern, replacement и subject использовать массивы.
Пример 5:
В этом примере показано использование модификатора / e, т.е когда replacement интерпретируется как php код. Ниже показано преобразование символов из нижнего в верхний регистр.
Пример 6:
В этом примере показано использование аргумента count. Здесь результат будет равен 2, так произошло две замены.
mixed preg_match (string pattern, string subject [, array &matches [, int flags [, int offset]]])Ищет в заданном тексте subject совпадения с шаблоном pattern
В случае, если дополнительный параметр matches указан, он будет заполнен результатами поиска. Элемент $matches будет содержать часть строки, соответствующую вхождению всего шаблона, $matches - часть строки, соответствующую первой подмаске, и так далее.
flags может принимать следующие значения:
PREG_OFFSET_CAPTURE
В случае, если этот флаг указан, для каждой найденной подстроки будет указана ее позиция в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемых данных: каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом - смещение. Данный флаг доступен в PHP 4.3.0 и выше.
Дополнительный параметр flags доступен начиная с PHP 4.3.0.
Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Дополнительный параметр offset доступен начиная с PHP 4.3.3.
Замечание: Использование параметра offset не эквивалентно замене сопоставляемой строки выражением substr($subject, $offset) при вызове функции preg_match_all() , поскольку шаблон pattern может содержать такие условия как ^ , $ или (? . Сравните:
В то время как этот пример
Функция preg_match() возвращает количество найденных соответствий. Это может быть 0 (совпадения не найдены) и 1, поскольку preg_match() прекращает свою работу после первого найденного совпадения. Если необходимо найти либо сосчитать все совпадения, следует воспользоваться функцией preg_match_all() . Функция preg_match() возвращает FALSE в случае, если во время выполнения возникли какие-либо ошибки.
Подсказка: Не используйте функцию preg_match() , если необходимо проверить наличие подстроки в заданной строке. Используйте для этого strpos() либо strstr() , поскольку они выполнят эту задачу гораздо быстрее.
Пример 2. Поиск слова "web" в тексте
|
Регулярные выражения (сокращенно — regex ) представляют собой последовательности символов, которые формируют шаблоны поиска. В основном они используются в шаблонах сопоставления со строками.
Краткая история
- Все началось в 1940 — 1960-х годах, когда множество умных людей говорили о регулярных выражениях;
- 1970-е годы g / re / p;
- 1980 Perl и Генри Спенсер;
- 1997 PCRE (регулярные выражения, совместимые с Perl). Именно тогда начался взлет того, что мы называем регулярные выражения. PCRE предоставляет библиотеки почти для каждого языка.
Общее использование регулярных выражений в PHP
PHP включает в себя три основные функции для работы с PCRE — preg_match , preg_match_all и preg_replace .
Сравнение соответствия
Выражение возвращает 1 , если соответствие установлено, 0 — если нет, и false — если возникает ошибка:
int preg_match (string $pattern, string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]])
Регулярного выражения пример, который возвращает количество найденных совпадений:
int preg_match_all (string $pattern, string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]])
Замена
Выражение возвращает замененную строку или массив (на основе объекта $subject ):
mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int $count ]])
Общее использование регулярных выражений в JavaScript
Регулярные выражения в JavaScript выглядят почти так же, как и в PHP .
Сравнение соответствия
Возвращает массив совпадений или null , если совпадений не найдено:
string.match(RegExp);
Замена
Регулярное выражение, которое возвращает строку с выполненными заменами:
string.replace(RegExp, replacement);
Особенности регулярных выражений в JavaScript
- Точка никогда не соответствует новой строке:
- Те же методы для сравнения соответствия и замены через регулярное выражение, что и без них.
Принципы составления шаблонов регулярных выражений
Рассмотрим пример, в котором нужно найти адреса электронной почты в базе кода. Наша цель:
Аналоговые сокеты
Регулярные выражения состоят из двух типов символов:
- специальные символы: ? * + {} () ^ $ / .
- Литералы.
Представьте себе входные строки как болты, а шаблон — как набор разъемов для них (в соответствующем порядке).
Специальные символы
При проверке регулярных выражений нужно знать, как работают специальные символы:
- Символ обратной косой черты \ может заменять другой специальный символ в регулярном выражении:
- Точка и w — .
Совпадение со всеми символами, кроме новых строк. Если хотите проверить на соответствие точке, и только точке — , на соответствие буквам, цифрам и нижнему подчеркиванию — w
- Квадратные скобки .
Совпадение с символами внутри скобок. Поддерживает диапазоны. Некоторые примеры:
o — соответствует любым a, b или c.
o прописные буквы.
o любая цифра.
o — соответствует любому буквенному символу в нижнем или верхнем регистре.
Опционально? Соответствие 0 или 1.
Звездочка *.
Звездочка обозначает 0 или более символов.
Соответствие 1 или более символам.
Фигурные скобки {}.
Минимальное и максимальное значения. Некоторые примеры синтаксиса регулярных выражений:
o {1,} не менее 1.
o {1,3} от 1 до 3.
o {1,64} от 1 до 64.
Добавим все это, чтобы получить регулярное выражение для адресов электронной почты:
/+@+(.+)*/i
Как это выглядит в PHP :
preg_match_all("/+@+(.+)*/i", $input_lines, $output_array);
Использование регулярного выражения для валидации
Задача : убедиться, что вводимые данные — это то, что мы ожидаем. Цель 1 : /[^w$.]/ Цель 2: /^{1,2}$/
Регулярные выражения подходят для поиска элементов, но вам нужно знать, что именно вы ищете.
Когда не стоит использовать регулярное выражение для проверки?
Многие случаи лучше обрабатывать с помощью функции PHP filter_var . Например, проверка адреса электронной почты должна выполняться с помощью встроенных фильтров PHP :
filter_var("[email protected]", FILTER_VALIDATE_EMAIL)
Валидация с помощью регулярных выражений
Регулярные выражения в конце строки используют анкоры:
^
— указывает начало строки.
$
— знак доллара, который указывает конец строки.
if (!preg_match("%^{1,2}$%", $_POST["subscription_frequency"])) { $isError = true; }
Исключенные классы символов
[^abc] — все, кроме a , b или c , включая новые строки.
Пример, который обеспечивает ввод только буквенно-цифровых символов, тире, точки, подчеркивания:
if (preg_match("/[^0-9a-z-_.]/i", $productCode)) { $isError = true; }
Поиск и замена
Наиболее распространенными функциями PCRE для выполнения поиска и замены являются preg_replace() и preg_replace_callback() . Но есть также preg_filter() и preg_replace_callback_array() , которые делают почти то же самое. Обратите внимание, что функция preg_replace_callback_array() доступна, начиная с PHP7 .
Заменить слова в списке
$subject = "I want to eat some apples."; echo preg_replace("/apple|banana|orange/", "fruit", $subject);
Результат
I want to eat some fruits.
Если в регулярном выражении есть подшаблоны (в круглых скобках ), можно заменить $N или N (где N является целым числом > = 1 ), это называется «обратная ссылка».
Перестановка двух чисел
$subject = "7/11"; echo preg_replace("/(d+)/(d+)/", "$2/$1", $subject);
Результат
Изменение форматирования даты
$subject = "2001-09-11"; echo preg_replace("/(d+)-(d+)-(d+)/", "$3/$2/$1", $subject);
Результат
Простой пример замены URL-адреса в теге
$subject = "Please visit https://php.earth/doc for more articles."; echo preg_replace("#(https?://([^s./]+(?:.[^s./]+)*[^s]*))#i", "$2", $subject);
Результат
int preg_match_all (string pattern, string subject, array &matches [, int flags [, int offset]])Ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags .
После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения.
Дополнительный параметр flags может комбинировать следующие значения (необходимо понимать, что использование PREG_PATTERN_ORDER одновременно с PREG_SET_ORDER бессмысленно):
PREG_PATTERN_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом: элемент $matches содержит массив полных вхождений шаблона, элемент $matches содержит массив вхождений первой подмаски, и так далее.
Возвращает количество найденных вхождений шаблона (может быть нулем) либо FALSE , если во время выполнения возникли какие-либо ошибки.
Пример 2. Жадный поиск совпадений с HTML-тэгами
Результат работы примера: |
Обзор Samsung Galaxy A7 (2017): не боится воды и экономии Стоит ли покупать samsung a7
Делаем бэкап прошивки на андроиде
Как настроить файл подкачки?
Установка режима совместимости в Windows
Резервное копирование и восстановление драйверов Windows