Php

Php регулярные выражения preg match: PHP: preg_match_all — Manual

) для создания сложных выражений.

Для чего используются регулярные выражения:

  • Регулярные выражения упрощают идентификацию строковых данных путем вызова одной функции. Это экономит время при составлении кода;
  • При проверке введенных пользователем данных, таких как адрес электронной почты, домен сайта, номер телефона, 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» — переменная, содержащая текст, с которым нужно сопоставить шаблон. PH/ — любая строка, которая начинается с PH.$Обозначает шаблон в конце строки./com$/ — guru99.com,yahoo.com и т.д.*Обозначает любое количество символов, ноль или больше./com*/ — computer, communication и т.д.+Требуется вхождение перед метасимволом символа (ов) хотя бы один раз./yah+oo/ — yahoo.Символ экранирования./yahoo+.com/ — воспринимает точку, как дословное значение.[…]Класс символов./[abc]/ — 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 пример, в котором проверяется валидность адреса электронной почты:

Результат: адрес электронной почты name@company. [a-zA-Z0-9._-]» соответствует любым буквам в нижнем или верхнем регистре, цифрам от 0 до 9 и точкам, подчеркиваниям или тире.
«+@[a-zA-Z0-9-]» соответствует символу @ , за которым следуют буквы в нижнем или верхнем регистре, цифры от 0 до 9 или дефисы.
«+.[a-zA-Z.]<2,5>$/» указывает точку, используя обратную косую черту, затем должны следовать любые буквы в нижнем или верхнем регистре, количество символов в конце строки должно быть от 2 до 5.

Метасимволы являются полезными, когда речь идет о сопоставлении на соответствие шаблонам.

Заключение

  • PHP regexp — это алгоритм поиска по шаблону;
  • Регулярные выражения полезны при выполнении проверок валидности, создании HTML-шаблонов , которые распознают теги и т. д.;
  • PHP имеет встроенные функции для работы с регулярными выражениями: preg_match , preg_split и preg_replace ;
  • Метасимволы позволяют создавать сложные шаблоны.

Данная публикация представляет собой перевод статьи « PHP Regular Expressions » , подготовленной дружной командой проекта Интернет-технологии. ру

Регулярные выражения позволяют найти в строке последовательности, соответствующие шаблону. Например шаблон «Вася(.*)Пупкин» позволит найти последовательность когда между словами Вася и Пупкин будет любое количество любых символов. Если надо найти шесть цифр, то пишем «[0-9]<6>» (если, например, от шести до восьми цифр, тогда «[0-9]<6,8>»). Здесь разделены такие вещи как указатель набора символов и указатель необходимого количества:

Вместо набора символов может быть использовано обозначение любого символа — точка, может быть указан конкретный набор символов (поддерживаются последовательности — упоминавшиеся «0-9»). Может быть указано «кроме данного набора символов».

Указатель количества символов в официальной документации по php называется «квантификатор». Термин удобный и не несет в себе кривотолков. Итак, квантификатор может иметь как конкретное значение — либо одно фиксированное («<6>»), либо как числовой промежуток («<6,8>»), так и абстрактное «любое число, в т. ч. 0″ («*»), «любое натуральное число» — от 1 до бесконечности («+»: «document[0-9]+.txt»), «либо 0, либо 1» («?»). По умолчанию квантификатор для данного набора символов равен единице («document[0-9].txt»).

Для более гибкого поиска сочетаний эти связки «набор символов — квантификатор» можно объединять в метаструктуры.

Как всякий гибкий инструмент, регулярные выражения гибки, но не абсолютно: зона их применения ограничена. Например, если вам надо заменить в тексте одну фиксированную строку на другую, фиксированную опять же, пользуйтесь str_replace. Разработчики php слезно умоляют не пользоваться ради этого сложными функциями ereg_replace или preg_replace, ведь при их вызове происходит процесс интерпретации строки, а это серьезно потребляет ресурсы системы. К сожалению, это любимые грабли начинающих php-программистов.

Пользуйтесь функциями регулярных выражений только если вы не знаете точно, какая «там» строка. Из примеров: поисковый код , в котором из строки поиска вырезаются служебные символы и короткие слова а так же вырезаются лишние пробелы (вернее, все пробелы сжимаются: » +» заменяется на один пробел). При помощи этих функций я проверяю email пользователя, оставляющего свой отзыв. Много полезного можно сделать, но важно иметь в виду: регулярные выражения не всесильны. Например, сложную замену в большом тексте ими лучше не делать. Ведь, к примеру, комбинация «(.*)» в программном плане означает перебор всех символов текста. А если шаблон не привязан к началу или концу строки, то и сам шаблон «двигается» программой через весь текст, и получается двойной перебор, вернее перебор в квадрате. Нетрудно догадаться, что еще одна комбинация «(.*)» означает перебор в кубе, и так далее. Возведите в третью степень, скажем, 5 килобайт текста. Получается 125 000 000 000 (прописью: сто двадцать пять миллиардов операций). Конечно же, если подходить строго, там стольких операций не будет, а будет раза в четыре-восемь меньше, но важен сам порядок цифр.

Набор символов

.точкалюбой символ
[ ]квадратные скобкикласс символов («любое из»). ]Кроме пробельных символов
|(одно|другое)На этом месте может быть один из перечисленных вариантов, например: (Вася|Петя|Маша). Если Вы не хотите, чтобы это попало в выборку используйте (?: . )

Не пользуйтесь классом символов для обозначения всего лишь одного (вместо «[ ]+» вполне сойдет » +»). Не пишите в классе символов точку — это ведь любой символ, тогда другие символы в классе будут просто лишними (а в негативном классе получится отрицание всех символов).

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

Квантификатором можно указать как конкретное значение, так и пределы. Если число заданных подпадает под пределы квантификатора, фрагмент выражения считается совпавшим с разбираемой строкой. Синтаксис:

Если нужно указать только необходимый минимум, а максимума нет, просто ставим запятую и не пишем второе число: «<5,>» («минимум 5»). Для наиболее часто употребляемых квантификаторов есть специальные обозначения:

*«звёздочка» или знак умножения
+плюс
?вопросительный знак

На практике такие символы используются чаще, чем фигурные скобки. » и «$» совпадают с началом и концом отдельных строк.

sсимвол «.» (точка) совпадает и с переносом строки (по умолчанию — нет)Aпривязка к началу текстаEзаставляет символ «$» совпадать только с концом текста. Игнорируется, если установлен парамерт m.UИнвертирует «жадность» для каждого квантификатора (если же после квантификатора стоит «?», этот квантификатор перестает быть «жадным»).eСтрока замены интерпретитуется как PHP код.

Функции для работы с регулярными выражениями

  • preg_grep — Возвращает массив вхождений, которые соответствуют шаблону
  • preg_match — Выполняет проверку на соответствие регулярному выражению. Данная функция ищет только первое совпадение!
  • preg_match_all — Выполняет глобальный поиск шаблона в строке
  • preg_quote — Экранирует символы в регулярных выражениях. Т.е. вставляет слэши перед всеми служебными символами (например, скобками, квадратными скобками и т. п.), чтобы те воспринимались буквально. Если у вас есть какой-либо ввод информации пользователем, и вы проверяете его с помощью регулярных выражений, то лучше перед этим заэкранировать служебные символы в пришедшей переменной
  • preg_replace — Выполняет поиск и замену по регулярному выражению
  • preg_replace_callback — Выполняет поиск по регулярному выражению и замену
  • preg_split — Разбивает строку по регулярному выражению
preg_grep

Функция preg_grep — Возвращает массив вхождений, которые соответствуют шаблону

array preg_grep (string pattern, array input [, int flags])

preg_grep() возвращает массив, состоящий из элементов входящего массива input, которые соответствуют заданному шаблону pattern.

Параметр flags может принимать следующие значения:

PREG_GREP_INVERT
В случае, если этот флаг установлен, функция preg_grep(), возвращает те элементы массива, которые не соответствуют заданному шаблону pattern.
Результат, возвращаемый функцией preg_grep() использует те же индексы, что и массив исходных данных. Если такое поведение вам не подходит, примените array_values() к массиву, возвращаемому preg_grep() для реиндексации.
Пример кода:

preg_match

Функция preg_match — Выполняет проверку на соответствие регулярному выражению

int preg_match ( string pattern, string subject [, array matches [, int flags [, int offset]]]) Ищет в заданном тексте subject совпадения с шаблоном pattern

В случае, если дополнительный параметр matches указан, он будет заполнен результатами поиска. Элемент $matches[0] будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] — часть строки, соответствующую первой подмаске, и так далее.

flags может принимать следующие значения:

PREG_OFFSET_CAPTURE
В случае, если этот флаг указан, для каждой найденной подстроки будет указана ее позиция в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемых данных: каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом — смещение.

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).

Функция preg_match() возвращает количество найденных соответствий. Это может быть 0 (совпадения не найдены) и 1, поскольку preg_match() прекращает свою работу после первого найденного совпадения. Если необходимо найти либо сосчитать все совпадения, следует воспользоваться функцией preg_match_all(). Функция preg_match() возвращает FALSE в случае, если во время выполнения возникли какие-либо ошибки.

Рекомендация: Не используйте функцию preg_match(), если необходимо проверить наличие подстроки в заданной строке. Используйте для этого strpos() либо strstr(), поскольку они выполнят эту задачу гораздо быстрее.

Пример кода
Пример кода
Пример кода
preg_match_all

Функция preg_match_all — Выполняет глобальный поиск шаблона в строке

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[0] содержит массив полных вхождений шаблона, элемент $matches[1] содержит массив вхождений первой подмаски, и так далее.

Пример кода

Как мы видим, $out[0] содержит массив полных вхождений шаблона, а элемент $out[1] содержит массив подстрок, содержащихся в тегах.

PREG_SET_ORDER
Если этот флаг установлен, результат будет упорядочен следующим образом: элемент $matches[0] содержит первый набор вхождений, элемент $matches[1] содержит второй набор вхождений, и так далее.

Пример кода

В таком случае массив $matches[0] содержит первый набор вхождений, а именно: элемент $matches[0][0] содержит первое вхождение всего шаблона, элемент $matches[0][1] содержит первое вхождение первой подмаски, и так далее. Аналогично массив $matches[1] содержит второй набор вхождений, и так для каждого найденного набора.

PREG_OFFSET_CAPTURE
В случае, если этот флаг указан, для каждой найденной подстроки будет указана ее позиция в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемых данных: каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом — смещение.

В случае, если никакой флаг не используется, по умолчанию используется PREG_PATTERN_ORDER.

Поиск осуществляется слева направо, с начала строки. Дополнительный параметр offset может быть использован для указания альтернативной начальной позиции для поиска. Аналогичного результата можно достичь, заменив subject на substr()($subject, $offset).

Возвращает количество найденных вхождений шаблона (может быть нулем) либо FALSE, если во время выполнения возникли какие-либо ошибки.

Пример кода
Пример кода
preg_quote

Функция preg_quote — Экранирует символы в регулярных выражениях

string preg_quote (string str [, string delimiter])

Функция preg_quote() принимает строку str и добавляет обратный слеш перед каждым служебным символом. ] $ ( ) < >= ! | :

Пример кода
Пример кода
preg_replace

Функция preg_replace — Выполняет поиск и замену по регулярному выражению

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

Выполняет поиск в строке subject совпадений с шаблоном pattern и заменяет их на replacement. В случае, если параметр limit указан, будет произведена замена limit вхождений шаблона; в случае, если limit опущен либо равняется -1, будут заменены все вхождения шаблона.

Replacement может содержать ссылки вида \n либо (начиная с PHP 4.0.4) $n, причем последний вариант предпочтительней. Каждая такая ссылка, будет заменена на подстроку, соответствующую n’нной заключенной в круглые скобки подмаске. n может принимать значения от 0 до 99, причем ссылка \0 (либо $0) соответствует вхождению всего шаблона. Подмаски нумеруются слева направо, начиная с единицы.

При использовании замены по шаблону с использованием ссылок на подмаски может возникнуть ситуация, когда непосредственно за маской следует цифра. В таком случае нотация вида \n приводит к ошибке: ссылка на первую подмаску, за которой следует цифра 1, запишется как \11, что будет интерпретировано как ссылка на одиннадцатую подмаску. Это недоразумение можно устранить, если воспользоваться конструкцией $<1>1, указывающей на изолированную ссылку на первую подмаску, и следующую за ней цифру 1.

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

Если во время выполнения функции были обнаружены совпадения с шаблоном, будет возвращено измененное значение subject, в противном случае будет возвращен исходный текст subject.

Первые три параметра функции preg_replace() могут быть одномерными массивами. В случае, если массив использует ключи, при обработке массива они будут взяты в том порядке, в котором они расположены в массиве. Указание ключей в массиве для pattern и replacement не является обязательным. Если вы все же решили использовать индексы, для сопоставления шаблонов и строк, участвующих в замене, используйте функцию ksort() для каждого из массивов.

В случае, если параметр subject является массивом, поиск и замена по шаблону производятся для каждого из его элементов. Возвращаемый результат также будет массивом.

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

Модификатор /e меняет поведение функции preg_replace() таким образом, что параметр replacement после выполнения необходимых подстановок интерпретируется как PHP-код и только после этого используется для замены. Используя данный модификатор, будьте внимательны: параметр replacement должен содержать корректный PHP-код, в противном случае в строке, содержащей вызов функции preg_replace(), возникнет ошибка синтаксиса.

Пример кода: Замена по нескольким шаблонам

Этот пример выведет:

Пример кода: Использование модификатора /e
Пример кода: Преобразует все HTML-теги к верхнему регистру
preg_replace_callback

Функция preg_replace_callback — Выполняет поиск по регулярному выражению и замену с использованием функции обратного вызова

mixed preg_replace_callback (mixed pattern, callback callback, mixed subject [, int limit])

Поведение этой функции во многом напоминает preg_replace(), за исключением того, что вместо параметра replacement необходимо указывать callback функцию, которой в качестве входящего параметра передается массив найденных вхождений. Ожидаемый результат — строка, которой будет произведена замена.

Пример кода
preg_split

Функция preg_split — Разбивает строку по регулярному выражению

array preg_split (string pattern, string subject [, int limit [, int flags]])

Возвращает массив, состоящий из подстрок заданной строки subject, которая разбита по границам, соответствующим шаблону pattern.

В случае, если параметр limit указан, функция возвращает не более, чем limit подстрок. Специальное значение limit, равное -1, подразумевает отсутствие ограничения, это весьма полезно для указания еще одного опционального параметра flags.

flags может быть произвольной комбинацией следующих флагов (соединение происходит при помощи оператора ‘|’):

PREG_SPLIT_NO_EMPTY
В случае, если этот флаг указан, функция preg_split() вернет только непустые подстроки.

PREG_SPLIT_DELIM_CAPTURE
В случае, если этот флаг указан, выражение, заключенное в круглые скобки в разделяющем шаблоне, также извлекается из заданной строки и возвращается функцией. Этот флаг был добавлен в PHP 4.0.5.

PREG_SPLIT_OFFSET_CAPTURE
В случае, если этот флаг указан, для каждой найденной подстроки, будет указана ее позиция в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемых данных: каждое вхождение возвращается в виде массива, в нулевом элементе которого содержится найденная подстрока, а в первом — смещение.

Примеры кода

В случае, если после открывающей круглой скобки следует «?:«, захват строки не происходит, и текущая подмаска не нумеруется. Например, если строка «the white queen» сопоставляется с шаблоном the ((?:red|white) (king|queen)), будут захвачены подстроки «white queen» и «queen», и они будут пронумерованы 1 и 2 соответственно:

Меня зовут Виталий Котов и я немного знаю о регулярных выражениях. Под катом я расскажу основы работы с ними. На эту тему написано много теоретических статей. В этой статье я решил сделать упор на количество примеров. Мне кажется, что это лучший способ показать возможности этого инструмента.

Некоторые из них для наглядности будут показаны на примере языков программирования PHP или JavaScript, но в целом они работают независимо от ЯП.

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

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

Вступление

Регулярные выражения — язык поиска подстроки или подстрок в тексте. Для поиска используется паттерн (шаблон, маска), состоящий из символов и метасимволов (символы, которые обозначают не сами себя, а набор символов).

Это довольно мощный инструмент, который может пригодиться во многих случая — поиск, проверка на корректность строки и т.д. Спектр его возможностей трудно уместить в одну статью.

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

  • preg_match (http://php.net/manual/en/function.preg-match.php)
  • preg_match_all (http://php.net/manual/en/function.preg-match-all.php)
  • preg_replace (http://php.net/manual/en/function.preg-replace.php)

Для работы с ними нужен текст, в котором мы будем искать или заменять подстроки, а также само регулярное выражение, описывающее правило поиска.

Функции на match возвращают число найденных подстрок или false в случае ошибок. Функция на replace возвращает измененную строку/массив или null в случае ошибки. Результат можно привести к bool (false, если не было найдено значений и true, если было) и использовать вместе с if или assertTrue для обработки результата работы.

В JS чаще всего мне приходится использовать:

Пример использования функций

В PHP регулярное выражение — это строка, которая начинается и заканчивается символом-разделителем. Все, что находится между разделителями и есть регулярное выражение.

Часто используемыми разделителями являются косые черты “/”, знаки решетки “#” и тильды “

”.0-9]$#

  • %[a-zA-Z0-9_-]%
  • Если необходимо использовать разделитель внутри шаблона, его нужно проэкранировать с помощью обратной косой черты. Если разделитель часто используется в шаблоне, в целях удобочитаемости, лучше выбрать другой разделитель для этого шаблона.

    В JavaScript регулярные выражения реализованы отдельным объектом RegExp и интегрированы в методы строк.

    Создать регулярное выражение можно так:

    Или более короткий вариант:

    Пример самого простого регулярного выражения для поиска:

    В этом примере мы просто ищем все символы “o”.

    В PHP разница между preg_match и preg_match_all в том, что первая функция найдет только первый match и закончит поиск, в то время как вторая функция вернет все вхождения.

    Пример кода на PHP:

    Пробуем то же самое для второй функции:

    В последнем случае функция вернула все вхождения, которые есть в нашем тексте.

    Тот же пример на JavaScript:

    Модификаторы шаблонов

    Для регулярных выражений существует набор модификаторов, которые меняют работу поиска.’ соответствует только началу обрабатываемого текста, в то время как метасимвол конца строки ‘$’ соответствует концу текста. Если этот модификатор используется, метасимволы «начало строки» и «конец строки» также соответствуют позициям перед произвольным символом перевода и строки и, соответственно, после, как и в самом начале, и в самом конце строки.

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

    О том, какие вообще бывают модификаторы, можно почитать тут.

    Пример предыдущего регулярного выражения с модификатором на JavaScript:

    Метасимволы в регулярных выражениях

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

    Чаще всего мы заранее не знаем, какой текст нам придется парсить. Заранее известен только примерный набор правил. Будь то пинкод в смс, email в письме и т.п.

    Первый пример, нам надо получить все числа из текста:

    Чтобы выбрать любое число, надо собрать все числа, указав “[0123456789]”. Более коротко можно задать вот так: “[0-9]”. Для всех цифр существует метасимвол “d”. Он работает идентично.

    Но если мы укажем регулярное выражение “/d/”, то нам вернётся только первая цифра. Мы, конечно, можем использовать модификатор “g”, но в таком случае каждая цифра вернется отдельным элементом массива, поскольку будет считаться новым вхождением.

    Для того, чтобы вывести подстроку единым вхождением, существуют символы плюс “+” и звездочка “*”. Первый указывает, что нам подойдет подстрока, где есть как минимум один подходящий под набор символ. Второй — что данный набор символов может быть, а может и не быть, и это нормально. Помимо этого мы можем указать точное значение подходящих символов вот так: “”, где N — нужное количество. Или задать “от” и “до”, указав вот так: “”.

    Сейчас будет пара примеров, чтобы это уложилось в голове:

    Примерно так же мы работает с буквами, не забывая, что у них бывает регистр. Вот так можно задавать буквы:

    • [a-z]
    • [a-zA-Z]
    • [а-яА-Я]

    C кириллицей указанный диапазон работает по-разному для разных кодировок.s.]+”

  • мы выбираем точку: “.” (обратный слеш нужен для экранирования метасимвола, так как знак точки описывает любой символ — см. выше)
  • мы выбираем любой символ латиницы в нижнем регистре: “[a-z]+”
  • Оказалось не так сложно. Теперь у нас есть email, собранный по частям. Рассмотрим на примере результата работы preg_match в PHP:

    Получилось! Но что, если теперь нам надо по отдельности получить домен и имя по email? И как-то использовать дальше в коде? Вот тут нам поможет “захват”. Мы просто выбираем, что нам нужно, и оборачиваем знаками (), как в примере:

    В массиве match нулевым элементом всегда идет полное вхождение регулярного выражения. А дальше по очереди идут “захваты”.

    В PHP можно именовать “захваты”, используя следующий синтаксис:

    Тогда массив матча станет ассоциативным:

    Это сразу +100 к читаемости и кода, и регулярки.

    Примеры из реальной жизни

    Парсим письмо в поисках нового пароля:

    Есть письмо с HTML-кодом, надо выдернуть из него новый пароль. Текст может быть либо на английском, либо на русском:

    Сначала мы говорим, что текст перед паролем может быть двух вариантов, использовав “или”.
    Вариантов можно перечислять сколько угодно:

    Далее у нас знак двоеточия и один пробел:

    Далее знак тега b:

    А дальше нас интересует все, что не символ “ Теги:

    • regexp
    • javascript
    • junior developer
    • php

    Добавить метки

    Рекомендуем к прочтению

    Регулярные выражения. Часть 1. Введение. Специальные символы., PHP

    Наконец-то я добрался до этой статьи, в ней я попытаюсь с нуля рассказать про регулярные выражения в PHP. Для начала — что это такое?

    Если в двух словах и понятным языком, то регулярные выражения — это метод, основанный на соответствии строки заданному шаблону.

    Основы основ

    Как я уже сказал, начну с самого нуля. Недаром же я пометил эту статью тегом «Начинающим».

    А начинается всё со строки в PHP.

    // создаем строку
    $stroka = 'abcdefghijklmnopqrstuvwxyz0123456789';
     
    // выводим строку
    echo $stroka;

    Если нам сперва нужно определить, находится ли abc внутри нашей строки, и только тогда вывести её, то попробуем сделать что-то подобное:

    // та же самая строка 
    $stroka = 'abcdefghijklmnopqrstuvwxyz0123456789';
     
    if( preg_match("/abc/", $stroka) ) { // возвратит 1 в случае положительного результата (<code>abc</code> внутри строки)
    	echo $stroka;
    }

    Код выше дан исключительно для примера, потому что это не самый оптимальный вариант поиска вхождения в строке, для этого лучше использовать PHP-функции strpos() или strstr().

    Небольшое отступление про русские буквы

    Хочу обратить ваше внимание, регулярные выражения PHP по умолчанию не поддерживают русские буквы и поэтому далеко не все примеры будут работать корректно, однако это легко исправляется модификатором /u (дальше всё объясню), который включает дополнительную функциональность: шаблон и строки станут обрабатываться как UTF-8 (доступно с версии PHP 4.абв/u», $stroka) ) {
    echo ‘Строка начинается с абв’;
    }

    Проще простого, верно ведь?

    Поиск соответствия концу строки. В чём отличие между \z и $

    Вот тут уже интереснее. Начну с того, что есть два «конца строки», один — это конец строковой переменной в целом, а другой — конец строки в тексте \n, то есть дальше текст продолжается, просто с новой строки.

    Так вот, если вам нужны именно последние символы в строковой переменной, всегда используйте \z.

    // обратите внимание, что после буквы "р" я добавил переход на новую строку
    $stroka = 'абвгдеёжзиклмнопр\nстуфхцчшщъыьэюя';
     
    if( preg_match("/юя\z/u", $stroka) ) {
    	echo 'Текст оканчивается на "юя"';
    } else {
    	echo 'Соответствий не найдено.';
    }

    Очень часто для этих целей используют $ и во многих постах на разных сайтах тоже это рекомендуется, однако ни разу не упоминается, как это работает на самом деле.

    Вообще мы можем в предыдущем примере заменить \z на $ и он будет проверять соответствие последних символов в переменной, но если включить поддержку многострочного поиска модификатором /m, то символы \n в самой строке уже будут восприниматься как переход на новую строку в тексте (для непонятливых — нажатие клавиши Enter) и тогда условие станет верным для букв пр .а-д]/u», $stroka, $matches);
     
    // элемент $matches[0] будет содержать массив(!) из соответствующих символов, каждый символ — отдельный элемент массива
    foreach( $matches[0] as $symbol ) {
    echo $symbol;
    }
    // в итоге получится еёжзиклмнопрстуфхцчшщъыьэюя

    Фигурные скобки { }

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

    $stroka = 'PHP123'; 
     
    echo preg_match("/PHP[0-9]{3}/", $stroka);

    Точка .

    Точка обозначает любой один символ, кроме переходов на новую строку \n или \r.

    $stroka = 'этот маг';
     
    // выведет 1, то есть совпадение найдено, но без флага /u работать как надо не будет
    echo preg_match("/м.г/u", $stroka);

    Астериск *

    Звёздочка означает любое количество символа, стоящего перед ней (в том числе 0). Поясню на примере.

    $stroka = 'php'; 
     
    // будет выведена 1 как для "php", так для "pp", "phhp", "phhhhhhhp"
    echo preg_match("/ph*p/", $stroka);

    Плюс +

    Плюс практически аналогичен звёздочке за одним единственным исключением — он не учитывает отсутствие символа, то есть, если взять предыдущий пример и строку pp, то будет выведен 0.(Привет|Здравствуй|Хай), мир/», $stroka, $matches);
     
    foreach($matches as $key=>$value) {
    echo $key.’->’.$value.'<br />’;
    }
    /*
    В результате получим
    0->Привет, мир
    1->Привет
    То есть первый элемент массива — это найденная подстрока, подходящая под шаблон, а второй — какое именно условие подошло.
    */

    Миша

    Недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

    Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

    Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

    preg-match-all — Русский — it-swarm.com.ru

    preg-match-all — Русский — it-swarm.com.ru

    it-swarm.com.ru

    pHP, чтобы извлечь строку из двойной кавычки

    «Неизвестный модификатор ‘g’ in …» при использовании preg_match в PHP?

    Как я могу преобразовать выражения ereg в preg в PHP?

    Как отфильтровать результаты SQL в сквозном отношении

    Замените модификатор preg_replace () e на preg_replace_callback

    Symfony 1.4 использует устаревшие функции в php 5.5

    Заменить устаревший preg_replace / e на preg_replace_callback

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

    Preg_match Пустая строка

    Соответствующий атрибут SRC тега IMG с использованием preg_match

    Обнаружение URL с помощью preg_match? без http: // в строке

    Как проверить доменное имя с помощью Regex и Php?

    PHP подтверждение по электронной почте

    preg_match: проверить формат дня рождения (дд/мм/гггг)

    PHP — регулярное выражение, разрешающее только буквы и цифры

    Разбейте слово верблюда на слова с помощью php preg_match (Regular Expression)

    PHP регулярные выражения: конечный разделитель ‘^’ не найден в

    Регулярное выражение: укажите «пробел или начало строки» и «пробел или конец строки»

    Как проверить формат строковой даты в PHP?

    PHP is_numeric или preg_match 0-9 проверки

    Разделитель не должен быть буквенно-цифровым или обратным слешем и preg_match

    PHP preg_match — разрешать только буквенно-цифровые строки и символы — _

    Как искать в массиве с preg_match?

    Создайте preg_match для подтверждения пароля (! @ # $%)

    PHP preg_match (. *) не соответствует предыдущим переносам строк

    PHP preg_match получить между строк

    Замена переменных-заполнителей в строке

    Regex — сопоставить все, кроме определенной строки

    Регулярное выражение, содержащее одно слово или другое

    php — проверить, заканчивается ли строка расширением изображения

    Регулярное выражение для обнаружения Internet Explorer 11

    Regex для проверки даты в PHP с использованием формата YYYY-MM-DD

    Объединение ORDER BY AND UNION в SQL Server

    Sql Union All * с * «отличным»

    подстановочный знак nginx server_name или универсальный

    Проблема с кэшированием Entity Framework

    ОБЪЕДИНЕНИЕ ВСЕХ двух ВЫБОРОВ с разными типами столбцов — ожидаемое поведение?

    Весной лови весь маршрут для index.html

    SQL UNION ALL для устранения дубликатов

    Regex для удаления комментариев и многострочных комментариев и пустых строк

    Заменить URL в тексте ссылками HTML

    Есть ли MySQL эквивалент PHP preg_replace?

    Преобразуйте обычные текстовые URL в гиперссылки HTML в PHP

    Удалить несколько пробелов

    PHP использование preg_replace: ошибка «Разделитель не должен быть буквенно-цифровым или с обратной косой чертой»

    Обеззараживание регулярных выражений (PHP)

    Замена акцентированных символов php

    Удалить часть строки, но только когда она находится в конце строки

    PHP удалить специальный символ из строки

    Заменить несколько символов новой строки, табуляции, пробела

    Заменить только первое совпадение, используя preg_replace

    PHP preg_replace разрешает только номера

    Как удалить `// <! [CDATA [` и конец `//]]>`?

    PHP удалить разрыв строки или CR LF без успеха

    PHP замена специальных символов, таких как à-> a, è-> e

    Удалите все не алфавитно-цифровые символы, используя preg_replace

    jquery .replace (/ ./ g, «») не работают для меня, но другие

    Предупреждение: preg_replace (): неизвестный модификатор ‘]’

    Как «обратное совпадение» с регулярным выражением?

    В чем разница между re.search и re.match?

    Как добавить строку в конец каждой строки в Vim?

    Scala: сопоставить и разобрать целую строку?

    Есть ли в Perl встроенный способ сравнения двух массивов на равенство?

    Проверить, начинается ли строка с чего-то?

    Вернуть позиции регулярного выражения match () в Javascript?

    Java: метод, чтобы получить позицию соответствия в строке?

    Подсчитать количество вхождений шаблона в файле (даже в одной строке)

    JavaScript — использовать переменную в строке соответствия

    Как я могу проверить, существует ли имя файла, соответствующее шаблону, в Perl?

    Как получить высоту кнопки, соответствующую высоте другого элемента?

    Соответствие строки запроса MySQL SELECT

    регулярное выражение для точного соответствия 5 цифрам

    Существует ли функция R для нахождения индекса элемента в векторе?

    Javascript Regexp цикл все совпадения

    JavaScript совпадает с массивом

    Javascript + Regex = Ничего не повторить ошибку?

    Ключи словаря совпадают в списке; получить пару ключ/значение

    Проверьте, соответствует ли строка регулярному выражению в JS

    Почему сопоставление с образцом в Scala не работает с переменными?

    Поиск без учета регистра в Монго

    регулярный адрес

    Использование соответствия для поиска подстрок в строках только с bash

    как проверить, содержит ли строка символ «+»

    Возвращаемое значение диапазона

    Выбор строк, в столбце которых есть строка типа ‘hsa ..’ (частичное совпадение строк)

    Соответствие похожих, но не точных текстовых строк в проектах Excel VBA

    Mysql поиск строки и числа с использованием MATCH () AGAINST ()

    Как проверить несколько переменных против значения?

    Поиск файла и найти точное совпадение и печать строки?

    Python — как мне использовать re для сопоставления всей строки

    Заменить всю строку, когда совпадение найдено с sed

    Поиск вхождений слова в строку в Python 3

    Regex Соответствует любой строке PowerShell

    Эластичный поиск точного соответствия

    Поиск с использованием INDEX и MATCH с двумя критериями

    Луа нужно разделить запятой

    используя $ и $ match в mongodb

    Значение Jquery соответствует Regex

    Удалить строки, содержащие определенные строки в R

    Проверьте, существует ли ячейка Excel на другом листе в столбце, и верните содержимое другого столбца.

    Content dated before 2011-04-08 (UTC) is licensed under CC BY-SA 2.5. Content dated from 2011-04-08 up to but not including 2018-05-02 (UTC) is licensed under CC BY-SA 3.0. Content dated on or after 2018-05-02 (UTC) is licensed under CC BY-SA 4.0. | Privacy

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

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

    Начнем с одной народной программистской мудрости:

    Некоторые люди, сталкиваясь с проблемой, думают:
    «Ага, я умный, я решу её с помощью регулярных выражений». Теперь у них две проблемы.

    Это довольно-таки объемный и сложный урок. Но, если ты дошел до сюда, то ты способен
    осилить и это. Просто почти теорию, не надо запоминать, а когда дойдешь до задачек, вернись
    и проясни непонятные моменты. Ну или открой мануал — там эта тема подробно разъясняется. Ссылка:
    http://www.php.net/manual/ru/reference.pcre.pattern.syntax.php

    Примеры шаблонов

    Начнем с пары простых примеров. Первое выражение на картинке ниже ищет
    последовательность из 3 букв, где первая буква это «к», вторая — любая русская буква и
    третья — это «т» без учета регистра (например, «кот» или «КОТ» подходит
    под этот шаблон). Второе выражение ищет в тексте время в формате 12:34.

    Любое выражение начинается с символа-ограничителя (delimiter по англ.). В качестве
    него обычно используют символ /, но можно использовать и другие
    символы, не имеющие специального назначения в регулярках, например, ~,
    # или @. Альтернативные разделители используют, если в
    выражении может встречаться символ /. Затем идет сам шаблон строки,
    которую мы ищем, за
    ним второй ограничитель и в конце может идти одна или несколько букв-флагов. Они
    задают дополнительные опции при поиске текста. Вот примеры флагов:

    • i — говорит, что поиск должен вестись без учета
      регистра букв (по умолчанию регистр учитывается)
    • u — говорит, что выражение и текст, по которому идет поиск,
      исплоьзуют кодировку utf-8, а не только латинские буквы. Без него поиск
      русских (и любых других нелатинских) символов может работать некорректно,
      потому стоит ставить его всегда.

    Сам шаблон состоит из обычных символов и специальных конструкций. Ну
    например, буква «к» в регулярках обозначает саму себя, а вот символы [0-5]
    значат «в этом месте может быть любая цифра от 0 до 5». Вот полный список
    специальных символов (в мануале php их называют метасимволы),
    а все остальные символы в регулярке — обычные:

    Ниже мы разберем значение каждого из этих символов (а также объясним почему буква
    «ё» вынесена отдельно в первом выражении), а пока попробуем
    применить наши регулярки к тексту и посмотреть, что выйдет. В php есть
    специальная функция preg_match($regexp, $text, $match),
    которая принимает на вход регулярку, текст и пустой массив. Она проверяет,
    есть ли в тексте подстрока, соответствующая данному шаблону и возвращает
    0, если нет,
    или 1, если она есть. А в переданный массив в элемент с индексом
    0 кладется первое найденное совпадение с регуляркой. Напишем простую
    программу, применяющую регулярные выражения к разным строкам:

    КодРезультат
    $regexp = "/к[а-яё]т/ui";
    
    // строки, к которым мы будем по очереди применять регулярку
    $lines = [
      'рыжий кот',
      'рыжий крот',
      'кит и кот'
    ];
    
    foreach ($lines as $line) {
        echo "Строка: $line\n";
    
        // сюда будет помещено первое
        // совпадение с шаблоном
        $match = [];
        if (preg_match($regexp, $line, $match)) {
            echo "+ Найдено слово '{$match[0]}'\n";
        } else {
            echo "- Ничего не найдено\n";
        }
    }
    Строка: рыжий кот
    + Найдено слово 'кот'
    Строка: рыжий крот
    - Ничего не найдено
    Строка: кит и кот
    + Найдено слово 'кит'
    

    Познакомившись с примером, изучим регулярные выражения более подробно.a-c] значит «один любой символ,
    кроме a, b или c».

  • Круглые скобки группируют символы и выражения. Например в
    выражении abc+ знак «плюс» относится только
    к букве c и это выражение ищет слова вроде abc, abcc, abccc. А если
    поставить скобки a(bc)+ то квантифиактор плюс относится
    уже к последовательности bc и выражение ищет слова
    abc, abcbc, abcbcbc
  • Примечание: в квадратных скобках можно указывать диапазоны
    символов, но помни, что русская буква ё идет отдельно от
    алфавита и чтобы написать «любая русская буква»,
    надо писать [а-яё].

    Бекслеши

    Если ты смотрел другие учебники по регулярным выражениям, то наверно заметил,
    что бекслеш везде пишут по-разному. Где-то пишут один бекслеш:
    \d, а здесь в примерах он повторен 2 раза: \\d.
    Почему?

    Язык регулярных выражений требует писать бекслеш один раз. Однако в
    строках в одиночных и двойных кавычках в PHP бекслеш тоже имеет особое
    значение: мануал про строки.
    Ну например, если написать $x = "\$"; то PHP воспримет это как
    специальную комбинацию и вставит в строку только символ $
    (и движок регулярных выражений не узнает о бекслеше перед ним). Чтобы
    вставить в строку последовательность \$, мы должны удвоить бекслеш
    и записать код в виде $x = "\\$";.

    По этой причине в некоторых случаях (там, где последовательность символов
    имеет специальный смысл в PHP) мы обязаны удваивать бекслеш:

    • Чтобы написать в регулярке \$, мы пишем в коде "\\$"
    • Чтобы написать в регулярке \\, мы удваиваем каждый
      бекслеш и пишем "\\\\"
    • Чтобы написать в регулярке бекслеш и цифру (\1),
      бекслеш надо удвоить: "\\1"

    В остальных случаях один или два бекслеша дадут один и тот же
    результат: "\\d" и "\d" вставят в строку пару
    символов \d — в первом случае 2 бекслеша это последовательность
    для вставки бекслеша, во втором случае специальной последовательности
    нет и символы вставятся как есть. Проверить, какие символы вставятся в строку,
    и что увидит движок регулярных выражений, можно с помощью
    echo: echo "\$";. Да, сложно, а что поделать?

    Специальные конструкции в регулярках

    • \d ищет одну любую цифру, \D — один
      любой символ, кроме цифры
    • \w соответствует одной любой букве (любого алфавита), цифре
      или знаку подчеркивания _. \W соответствует
      любому символу, кроме буквы, цифры, знака подчеркивания.

    Также, есть удобное условие для указания на границу слова: \b.
    Эта конструкция обозначает, что с одной стороны от нее должен стоять символ,
    являющийся буквой/цифрой/знаком подчеркивания (\w), а с
    другой стороны — не являющийся. Ну, например, мы хотим найти в тексте слово
    «кот». Если мы напишем регулярку /кот/ui, то она
    найдет последовательность этих букв в любом месте — например, внутри слова
    «скотина». Это явно не то, что мы хотели. Если же мы добавим
    условие границы слова в регулярку: /\bкот\b/ui, то теперь
    искаться будет только отдельно стоящее слово «кот».

    Мануал

    Также, есть полезный сайт
    Regex101, где
    можно протестировать свою регулярку и проверить, что она найдет в тексте. Помни,
    что на том сайте бекслеши надо писать ровно один раз, и
    ставить флаг u не требуется.

    Задачка


    Напиши программу, получающую на вход автомобильный номер, и проверяющую,
    правильно ли он введен. Автомобильный номер имеет вид «а123вг»,
    то есть начинается с буквы, за которой идет 3 цифры, и еще 2 буквы. Никаких
    посторонних символов быть в нем не должно.

    Эту программу надо решить с помощью preg_match() и регулярного
    выражения. Протестировать его ты можешь например на сайте Regex101.

    Задачка на проверку телефонов


    Дан текст, который по идее должен быть номером телефона в виде 8-(911)-506 56 56
    (т.е. человек может ввести не только цифры, но и скобки, минусы, может что-то еще).
    Но в реальности, пользователь может вместо номера написать что угодно. Напиши скрипт для
    проверки правильности введенного номера («8(911)-506 56 56» — правильный
    номер, «8-911-50-656-56» — правильный, «89115065656» — правильный, «02» — неправильный,
    «89115065656 позвать Люду» — неправильный).

    Задачу надо проверить на большом числе телефонов,
    чтобы убедиться что твой код правильный. Для этого давай добавим в программу
    тесты, чтобы сразу было видно, верно все работает или нет.
    Сделай 2 списка номеров (правильные и нет), добавь их в программу и напиши цикл,
    который их по очереди прогоняет через регулярку и проверяет,
    что они определяются как надо (если нет — надо вывести, какой именно номер
    не распознается правильно).

    Вот список номеров:

    
    // Правильные: 
    $correctNumbers = [ 
      '84951234567',  '+74951234567', '8-495-1-234-567', 
      ' 8 (8122) 56-56-56', '8-911-1234567', '8 (911) 12 345 67', 
      '8-911 12 345 67', '8 (911) - 123 - 45 - 67', '+ 7 999 123 4567', 
      '8 ( 999 ) 1234567', '8 999 123 4567'
    ];
    
    // Неправильные: 
    $incorrectNumbers = [
      '02', '84951234567 позвать люсю', '849512345', '849512345678', 
      '8 (409) 123-123-123', '7900123467', '5005005001', '8888-8888-88',
      '84951a234567', '8495123456a', 
      '+1 234 5678901', /* неверный код страны */
      '+8 234 5678901', /* либо 8 либо +7 */
      '7 234 5678901' /* нет + */
    ];
    

    Также, на regex101
    https://regex101.com/r/qF7vT8/3 уже введены номера и можно простестировать
    свою регулярку. Помни что на этом сайте надо писать бекслеш один раз,
    например \s, а не \\s. Флаг m там стоит чтобы
    ^ и $ в регулярке обозначали «начало и конец
    любой строки», а не «начало и конец всего текста». Флаг g (его нет в PHP,
    он только на этом сайте) значит что надо искать все совпадения с
    регуляркой, а не только первое.

    Подсказка: не надо строить сложных выражений и предусматривать все
    возможные комбинации символов. Достаточно написать:
    сначала идет +7 или 8, за ними ровно 10 цифр, между которыми может быть
    любое число скобок, минусов, пробелов

    Повторим

    • preg_match находит первое совпадение с
      регулярными выражением и проверяет, соответствует ли текст или часть выражению
    • preg_match_all находит все фрагменты текста,
      соответствующие регулярке
    • preg_split разбивает текст на массив частей
      по регулярному выражению
    • preg_replace заменяет в тексте части, соответствующие
      регулярке, на данную строку

    Задачки (пока без картинок)

    • На вход скрипта дан введенный пользователем номер телефона в
      виде 8-911-404-44-11 или +7(812)6786767 (в начале 8 или +7, потом идут 10 цифр и, возможно, какие-то символы).
      То есть, как и в прошлой задаче, человек вводит номер как хочет.
      Надо проверить номер на правильность и привести любой номер к единому формату 89114044411
      (то есть, заменить +7 на 8 и выкинуть весь мусор вроде пробелов, скобок и минусов, кроме цифр)

    • Автозамена. Напиши скрипт, заменяющий определенное слово на другое (например, слово
      «дурак» на «хороший человек» в фразе «ты дурак»). Скрипт должен не пропускать слово,
      если оно написано буквами в разном регистре (ДуРАк), с заменой русских букв
      на похожие английские (а -> a), или через пробелы («ты — д у р а к»)

    • Дан текст, содержащий в себе email’ы (адреса почты вроде [email protected] ). Напиши
      скрипт, выводящий все email, встречающиеся в этом тексте

    • «Grammar Nazi». Напиши скрипт, проверяющий текст на наличие злостных ошибок:
      • нет пробела после запятой, точки с запятой, восклицательного знака,
        вопросительного знака, двоеточия
      • «жи» или «ши» написано с буквой ы
      • в тексте есть слово «координально» или «сдесь», «зделал», «зделаю», «зделан»
      • в тексте есть слова «а» или «но» без запятой перед ними.
      • (можешь добавить еще несколько правил, если хорошо знаешь русский язык)

      В случае обнаружения ошибки скрипт должен писать сообщение об этом и выводить
      кусок текста с ошибкой (чтобы было понятно, что не так).


    • Если ты сделал задачу про Grammar Nazi, сделай скрипт, которы вместо сообщения об ошибках будет
      молча их исправлять.

    Опечаточники

    Как тебе наверно известно, многие люди, занимающие государственные посты, тратят свои силы
    отнюдь не на улучшение ситуации в своем городе или регионе, а на придумывание разнообразных
    схем по перемещению вверенных им бюджетных средств в свои карманы.

    Например, государственные органы, которые хотят провести закупки, обязаны организовать публичные торги и
    разместить объявление о них на сайте госзакупок. Чтобы помешать всем желающим участвовать в тендере
    (и чтобы отдать заказ «своим людям» и получить потом от них в свой карман часть денег), они заменяют в
    описании заказа некоторые русские буквы на похожие на них латинские. Таким образом, не предупрежденные
    заранее организации не смогут найти объявление через поиск и принять участие в конкурсе.

    Давай попробуем применить наши знания языка PHP для того, чтобы вывести жуликов на чистую воду.

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

    Для проверки работоспособности, попробуй применить программу к тексту из поля «Наименование заказа» на
    странице (осторожно, спойлер!)
    http://zakupki.gov.ru/pgz/public/action/orders/info/common_info/show?notificationId=5193640
    или http://zakupki.gov.ru/pgz/public/action/orders/info/common_info/show?notificationId=5138013
    ололо кто бы поверил!

    Дополнительная задача: добавь в программу автоматическое исправление найденных «опечаток».

    Подсказки для глупеньких: слова с опечатками найти легко: это слово, которое
    начинается с одной или нескольких русских букв, за которыми идет латинская. Ну или начинается с латинской,
    за которой идет русская. Достаточно минимальных знаний регулярных выражений, чтобы написать решение.

    P.S. На сайте программистских комиксов xkcd есть комикс про регулярные выражения:
    перевод, оригинал (англ.).

    дальше:
    Повторим? →

    ——

    Куда вводить код? Что надо скачать? Читай первый урок.

    Есть вопросы? Задай гуглу или автору.

    Нравится урок? Лайкай, репости, приглашай друзей, пости котов и Канако,
    шли добра, решай задачи, помогай новичкам! Кнопок для лайка нет, кто хочет зарепостить, всегда может сделать это ручками.

    Как связаться с автором? Я хочу переодеть его в платье
    школьницы и жениться на нем. Ящик codedokode (кот) gmail.com ждет ваших писем. А
    вконтактик и
    фейсбучек ждут ваших лайков.
    Но ответ на банальные вопросы лучше искать в Гугле или на stackoverflow.

    Я решил задачку!!! Молодец, делай следующий урок

    Ideone не работает!11 Ну так открой Гугл и найди сайты
    вроде https://repl.it/languages/php , http://phptester.net/ ,
    http://sandbox.onlinephpfunctions.com/ ,
    http://codepad.org/ или http://www.runphponline.com/ . Не ленись.

    Почему так много рекламы? Всю рекламу
    на сайте ставит юкоз (бесплатный хостинг же), а не я.

    На сайте установлена система Google Analytics (и еще несколько аналогичных систем от юкоза). Данные о твоем IP-адресе, посещаемых страницах,
    времени посещения отправляются в Google Corporation, США. Хочу знать, кто и зачем сюда заходит. Поверь,
    другие сайты делают точно так же. Все сайты пишут логи.

    регулярные выражения, функция preg match all

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

    HTML, CSS, XML и другие формализованные файлы — классические задачи для применения функции preg match all. Не меньший эффект дает поиск адресов, фамилий, номеров телефонов, e-mail и другой информации в неформализованных текстах.

    Формат функции

    PHP предлагает две функции поиска: preg match и preg match all. Первая ищет первое вхождение шаблона в строке, вторая — все вхождения. Иногда используют термин «совпадение с шаблоном». В первом случае результат функции — «строка совпадает с шаблоном», во втором случае — «в строке найдены совпадения с шаблоном». Формально термин «совпадение» более точно отражает суть, но естественный контекст операции обычно — «поиск» информации. На практике востребовано и одно, и другое. Ниже рассмотрен формат функций.

    Результат функции — число, количество совпадений. Все найденные совпадения записываются в массив — matches. В случае функции preg match all можно указать порядок сортировки массива:

    • PREG_PATTERN_ORDER;
    • PREG_SET_ORDER.

    Сортировка по первому варианту группирует результаты поиска по номеру регулярного выражения (значение по умолчанию). Во втором случае результаты группируются по месту их нахождения в строке.

    Символ — элемент шаблона

    Важно помнить, что шаблон оперирует символами. Программирование уже давно забыло, что такое тип данных «символ». Современные языки не опускаются ниже понятия «строка», но в отношении шаблона надо понимать: здесь манипулируют символами.

    Построение шаблона — это, прежде всего, указание нужной последовательности символов. Если это четко усвоить, то ошибок в шаблоне не будет. Во всяком случае, будет гораздо меньше.

    • а — это конкретный элемент шаблона — символ.\.]+\.[a-z]{2,3}/ — вариант для распознавания e-mail.

    Применение собственных шаблонов для preg match all, примеры их в интернете, анализ кода страниц сайтов и другие источники позволяют сформировать собственную библиотеку шаблонов.

    Вариантов для поиска информации может быть множество. В частности, приведенные последние две конструкции можно смоделировать иначе. Во многих случаях предпочтение будет иметь тот шаблон, который быстрее и точнее обеспечит нужное совпадение. Применение на PHP preg match all, как и аналогичных функций на других языках, требует практики, внимания и предварительной проверки правильности шаблонов.

    Регулярные выражения в PHP [АйТи бубен]

    php.net: preg_match прекращает свою работу после первого найденного совпадения. Если необходимо найти, либо сосчитать все совпадения, следует воспользоваться функцией preg_match_all.

    int preg_match ( string pattern, string subject [, array matches [, int flags]])

    preg_match() возвращает FALSE в случае, если во время выполнения возникли какие-либо ошибки.a], всегда соответствует переводу строки, независимо от наличия этого модификатора.

    preg_match_all

    int preg_match_all(string pattern, string subject, array matches [, int flags [, int offset]])

    Функция работает также, как и preg_match, но ищет не только первое вхождение, а все имеющиеся и складывает их в массив matches, который для данной функции (в отличие от preg_match()) является обязательным.

    preg_replace — выполняет поиск и замену по регулярному выражению. Выполняет поиск в строке subject совпадений с шаблоном pattern и заменяет их на replacement. В случае, если параметр limit указан, будет произведена замена limit вхождений шаблона.

    mixed preg_replace(mixed pattern, mixed replacement, mixed subject [, int limit])

    В PHP существует две функции для поиска строк при помощи регулярных выражений ereg() и eregi(). Единственное отличие между ними функция eregi() нечувствительна к регистру.

    Регулярные выражения в Python: теория и практика

    Рассмотрим регулярные выражения в Python, начиная синтаксисом и заканчивая примерами использования.

    Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.

    1. Для чего нужны регулярные выражения?
    2. Регулярные выражения в Python
    3. Задачи

    Для чего нужны регулярные выражения?

    • для определения нужного формата, например телефонного номера или email-адреса;
    • для разбивки строк на подстроки;
    • для поиска, замены и извлечения символов;
    • для быстрого выполнения нетривиальных операций.

    Синтаксис  таких выражений в основном стандартизирован, так что вам следует понять их лишь раз, чтобы использовать в любом языке программирования.

    Примечание Не стоит забывать, что регулярные выражения не всегда оптимальны, и для простых операций часто достаточно встроенных в Python функций.

    Хотите узнать больше? Обратите внимание на статью о регулярках для новичков.

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

    В Python для работы с регулярками есть модуль re. Его нужно просто импортировать:

    import re

    А вот наиболее популярные методы, которые предоставляет модуль:

    • re.match()
    • re.search()
    • re.findall()
    • re.split()
    • re.sub()
    • re.compile()

    Рассмотрим каждый из них подробнее.

    re.match(pattern, string)

    Этот метод ищет по заданному шаблону в начале строки. Например, если мы вызовем метод match() на строке «AV Analytics AV» с шаблоном «AV», то он завершится успешно. Но если мы будем искать «Analytics», то результат будет отрицательный:

    import re
    result = re.match(r'AV', 'AV Analytics Vidhya AV')
    print result
    
    Результат:
    <_sre.SRE_Match object at 0x0000000009BE4370>
    

    Искомая подстрока найдена. Чтобы вывести её содержимое, применим метод group() (мы используем «r» перед строкой шаблона, чтобы показать, что это «сырая» строка в Python):

    result = re.match(r'AV', 'AV Analytics Vidhya AV')
    print result.group(0)
    
    Результат:
    AV

    Теперь попробуем найти «Analytics» в данной строке. Поскольку строка начинается на «AV», метод вернет None:

    result = re.match(r'Analytics', 'AV Analytics Vidhya AV')
    print result
    
    Результат:
    None

    Также есть методы start() и end() для того, чтобы узнать начальную и конечную позицию найденной строки.

    result = re.match(r'AV', 'AV Analytics Vidhya AV')
    print result.start()
    print result.end()
    
    Результат:
    0
    2

    Эти методы иногда очень полезны для работы со строками.

    re.search(pattern, string)

    Метод похож на match(), но ищет не только в начале строки. В отличие от предыдущего, search() вернёт объект, если мы попытаемся найти «Analytics»:

    result = re.search(r'Analytics', 'AV Analytics Vidhya AV')
    print result.group(0)
    
    Результат:
    Analytics

    Метод search() ищет по всей строке, но возвращает только первое найденное совпадение.

    re.findall(pattern, string)

    Возвращает список всех найденных совпадений. У метода findall() нет ограничений на поиск в начале или конце строки. Если мы будем искать «AV» в нашей строке, он вернет все вхождения «AV». Для поиска рекомендуется использовать именно findall(), так как он может работать и как re.search(), и как re.match().

    result = re.findall(r'AV', 'AV Analytics Vidhya AV')
    print result
    
    Результат:
    ['AV', 'AV']

    re.split(pattern, string, [maxsplit=0])

    Этот метод разделяет строку по заданному шаблону.

    result = re.split(r'y', 'Analytics')
    print result
    
    Результат:
    ['Anal', 'tics']

    В примере мы разделили слово «Analytics» по букве «y». Метод split() принимает также аргумент maxsplit со значением по умолчанию, равным 0. В данном случае он разделит строку столько раз, сколько возможно, но если указать этот аргумент, то разделение будет произведено не более указанного количества раз. Давайте посмотрим на примеры:

    result = re.split(r'i', 'Analytics Vidhya')
    print result
    
    Результат:
    ['Analyt', 'cs V', 'dhya'] # все возможные участки.
    result = re.split(r'i', 'Analytics Vidhya',maxsplit=1)
    print result
    
    Результат:
    ['Analyt', 'cs Vidhya']

    Мы установили параметр maxsplit равным 1, и в результате строка была разделена на две части вместо трех.

    re.sub(pattern, repl, string)

    Ищет шаблон в строке и заменяет его на указанную подстроку. Если шаблон не найден, строка остается неизменной.

    result = re.sub(r'India', 'the World', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    'AV is largest Analytics community of the World'

    re.compile(pattern, repl, string)

    Мы можем собрать регулярное выражение в отдельный объект, который может быть использован для поиска. Это также избавляет от переписывания одного и того же выражения.

    pattern = re.compile('AV')
    result = pattern.findall('AV Analytics Vidhya AV')
    print result
    result2 = pattern.findall('AV is largest analytics community of India')
    print result2
    
    Результат:
    ['AV', 'AV']
    ['AV']

    До сих пор мы рассматривали поиск определенной последовательности символов. Но что, если у нас нет определенного шаблона, и нам надо вернуть набор символов из строки, отвечающий определенным правилам? Такая задача часто стоит при извлечении информации из строк. Это можно сделать, написав выражение с использованием специальных символов. Вот наиболее часто используемые из них:

    ОператорОписание
    .Один любой символ, кроме новой строки \n.
    ?0 или 1 вхождение шаблона слева
    +1 и более вхождений шаблона слева
    *0 и более вхождений шаблона слева
    \wЛюбая цифра или буква (\W — все, кроме буквы или цифры)
    \dЛюбая цифра [0-9] (\D — все, кроме цифры)
    \sЛюбой пробельный символ (\S — любой непробельный символ)
    \bГраница слова
    [. и $Начало и конец строки соответственно
    {n,m}От n до m вхождений ({,m} — от 0 до m)
    a|bСоответствует a или b
    ()Группирует выражение и возвращает найденный текст
    \t, \n, \rСимвол табуляции, новой строки и возврата каретки соответственно

    Больше информации по специальным символам можно найти в документации для регулярных выражений в Python 3.

    Ну хватит теории. Рассмотрим примеры использования Python RegEx.

    Задачи

    Вернуть первое слово из строки

    Сначала попробуем вытащить каждый символ (используя .)

    result = re.findall(r'.', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['A', 'V', ' ', 'i', 's', ' ', 'l', 'a', 'r', 'g', 'e', 's', 't', ' ', 'A', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', ' ', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', ' ', 'o', 'f', ' ', 'I', 'n', 'd', 'i', 'a']

    Для того, чтобы в конечный результат не попал пробел, используем вместо . \w.

    result = re.findall(r'\w', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['A', 'V', 'i', 's', 'l', 'a', 'r', 'g', 'e', 's', 't', 'A', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', 'o', 'f', 'I', 'n', 'd', 'i', 'a']

    Теперь попробуем достать каждое слово (используя * или +)

    result = re.findall(r'\w*', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['AV', '', 'is', '', 'largest', '', 'Analytics', '', 'community', '', 'of', '', 'India', '']

    И снова в результат попали пробелы, так как * означает «ноль или более символов». Для того, чтобы их убрать, используем +:

    result = re.findall(r'\w+', 'AV is largest Analytics community of India')
    print result
    Результат:
    ['AV', 'is', 'largest', 'Analytics', 'community', 'of', 'India']

    Теперь вытащим первое слово, используя ^:

    result = re., то мы получим последнее слово, а не первое:

    result = re.findall(r'\w+$', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    [‘India’]

    Вернуть первые два символа каждого слова

    Вариант 1: используя \w, вытащить два последовательных символа, кроме пробельных, из каждого слова:

    result = re.findall(r'\w\w', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['AV', 'is', 'la', 'rg', 'es', 'An', 'al', 'yt', 'ic', 'co', 'mm', 'un', 'it', 'of', 'In', 'di']

    Вариант 2: вытащить два последовательных символа, используя символ границы слова (\b):

    result = re.findall(r'\b\w.', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['AV', 'is', 'la', 'An', 'co', 'of', 'In']

    Вернуть домены из списка email-адресов

    Сначала вернём все символы после «@»:

    result = re.findall(r'@\w+', '[email protected], [email protected], [email protected], [email protected]')
    print result
    
    Результат:
    ['@gmail', '@test', '@analyticsvidhya', '@rest']

    Как видим, части «.com», «.in» и т. д. не попали в результат. Изменим наш код:

    result = re.findall(r'@\w+.\w+', '[email protected], [email protected], [email protected], [email protected]')
    print result
    
    Результат:
    ['@gmail.com', '@test.in', '@analyticsvidhya.com', '@rest.biz']

    Второй вариант — вытащить только домен верхнего уровня, используя группировку — ( ):

    result = re.findall(r'@\w+.(\w+)', '[email protected], [email protected], [email protected], [email protected]')
    print result
    
    Результат:
    ['com', 'in', 'com', 'biz']

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

    Используем \d для извлечения цифр.

    result = re.findall(r'\d{2}-\d{2}-\d{4}', 'Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009')
    print result
    
    Результат:
    ['12-05-2007', '11-11-2011', '12-01-2009']

    Для извлечения только года нам опять помогут скобки:

    result = re.findall(r'\d{2}-\d{2}-(\d{4})', 'Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009')
    print result
    
    Результат:
    ['2007', '2011', '2009']

    Извлечь слова, начинающиеся на гласную

    Для начала вернем все слова:

    result = re.findall(r'\w+', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['AV', 'is', 'largest', 'Analytics', 'community', 'of', 'India']

    А теперь — только те, которые начинаются на определенные буквы (используя []):

    result = re.findall(r'[aeiouAEIOU]\w+', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['AV', 'is', 'argest', 'Analytics', 'ommunity', 'of', 'India']

    Выше мы видим обрезанные слова «argest» и «ommunity». Для того, чтобы убрать их, используем \b для обозначения границы слова:

    result = re.findall(r'\b[aeiouAEIOU]\w+', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['AV', 'is', 'Analytics', 'of', 'India']

    Также мы можем использовать ^ внутри квадратных скобок для инвертирования группы:

    result = re.aeiouAEIOU ]\w+', 'AV is largest Analytics community of India')
    print result
    
    Результат:
    ['largest', 'community']

    Проверить формат телефонного номера

    Номер должен быть длиной 10 знаков и начинаться с 8 или 9. Есть список телефонных номеров, и нужно проверить их, используя регулярки в Python:

    li = ['9999999999', '999999-999', '99999x9999']
    
    for val in li:
        if re.match(r'[8-9]{1}[0-9]{9}', val) and len(val) == 10:
            print 'yes'
        else:
            print 'no'
    
    Результат:
    yes
    no
    no

    Разбить строку по нескольким разделителям

    Возможное решение:

    line = 'asdf fjdk;afed,fjek,asdf,foo' # String has multiple delimiters (";",","," ").
    result = re.split(r'[;,\s]', line)
    print result
    
    Результат:
    ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

    Также мы можем использовать метод re.sub() для замены всех разделителей пробелами:

    line = 'asdf fjdk;afed,fjek,asdf,foo'
    result = re.sub(r'[;,\s]',' ', line)
    print result
    
    Результат:
    asdf fjdk afed fjek asdf foo

    Извлечь информацию из html-файла

    Допустим, нужно извлечь информацию из html-файла, заключенную между <td> и </td>, кроме первого столбца с номером. Также будем считать, что html-код содержится в строке.

    Пример содержимого html-файла:

    1NoahEmma2LiamOlivia3MasonSophia4JacobIsabella5WilliamAva6EthanMia7MichaelEmily

    С помощью регулярных выражений в Python это можно решить так (если поместить содержимое файла в переменную test_str):

    result = re.findall(r'\d([A-Z][A-Za-z]+)([A-Z][A-Za-z]+)', test_str)
    print result
    
    Результат:
    [('Noah', 'Emma'), ('Liam', 'Olivia'), ('Mason', 'Sophia'), ('Jacob', 'Isabella'), ('William', 'Ava'), ('Ethan', 'Mia'), ('Michael', 'Emily')]

    Адаптированный перевод «Beginners Tutorial for Regular Expressions in Python»

    15,1. Базовые регулярные выражения с preg_match () и preg_match_all ()

    Базовые регулярные выражения с preg_match () и preg_match_all ()

    Базовая функция регулярного выражения - preg_match () , и она принимает два параметра: шаблон для сопоставления и шаблон для соответствия сопоставьте это с. Он применит регулярное выражение в параметре один к строке в параметре два и проверит, найдет ли совпадение - если оно найдет, то вернет 1; в противном случае - 0. Причина, по которой он возвращает 1, заключается в том, что регулярные выражения возвращают количество найденных совпадений, но preg_match () из соображений скорости возвращает, как только находит первое совпадение - это означает, что очень быстро проверить, действительно ли шаблон существует в строке.Альтернативная функция preg_match_all () не завершает работу после первого совпадения; мы вернемся к этому позже в этой главе.

    Регулярные выражения начинаются с косой черты /, за которой следует последовательность специальных символов и слов для сопоставления, затем еще одна косая черта и, необязательно, строка букв, влияющих на выражение. В Таблице 15-1 показан список самых простых регулярных выражений и строк с указанием того, выполнено ли совпадение.

    Таблица 15-1.вызовы preg_match () и их соответствие

    Функциональный вызов

    Результат

    preg_match ("/ php /", "php")

    Правда

    preg_match ("php /", "php")

    Ошибка; вам нужна косая черта в начале

    preg_match ("/ php /", "PHP")

    Ложь; регулярные выражения чувствительны к регистру

    preg_match ("/ php / i", "PHP")

    True; / i означает «без учета регистра»

    preg_match ("/ Foo / i", "FOO")

    Правда

    Модификатор i делает регулярные выражения нечувствительными к регистру.

    preg_match () возвращает true, если есть совпадение, поэтому вы можете использовать его так:

     if ... 

    Регулярные выражения PHP - Функции PHP - Учебник PHP

    1. Дом
    2. Учебник PHP
    3. Функции PHP
    4. Регулярные выражения PHP

    Регулярные выражения - это шаблоны, определяющие список символов. Их можно использовать для поиска, замены и другой работы со строками, но чаще всего они используются для проверки форм, поскольку формы позволяют пользователям вводить неизвестные данные.Здесь мы узнаем, как определить, использует ли адрес электронной почты правильный синтаксис.

    В прошлом PHP поддерживал два метода сопоставления с образцом (POSIX и PCRE). Теперь PHP прекращает поддержку методов POSIX, оставляя PCRE (Perl-совместимые регулярные выражения) нашей темой для этого руководства.

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

    Есть два типа регулярных выражений. «Буквальные» символы - это те, которые соответствуют самим себе, а «метасимволы» - это те, которые имеют другое значение.

    «Буквальные» символы могут представлять собой отдельный символ, слово, фразу и т. Д., Которые воспринимаются буквально, по номинальной стоимости. Используя функцию preg_match (), давайте посмотрим на пример буквального регулярного выражения. (Примечание. Шаблоны букв и метасимволов должны быть заключены в косую черту "/" , разделители , как показано в нашем примере ниже.)


    $ string = "На какой стороне курицы больше всего перьев?";
    if (preg_match ("/ курица /", $ строка)) {
    эхо $ строка.«
    »;
    echo «Снаружи.»;
    }
    ?>

    Так как в нашем примере совпадение найдено, вопрос и ответ будут повторены. Если вы измените слово «курица» в любом из случаев, в которых оно найдено, совпадение больше не будет, и утверждения не будут повторяться.

    Метасимволы по понятным причинам более сложны, чем их буквальные аналоги, но после небольшого изучения их можно интерпретировать.Начнем с простой темы: классы персонажей.

    Классы символов определяют, какие символы допустимы в шаблоне. [a-z], [A-B] и [0-9] - все это примеры классов символов, охватывающих широкий диапазон символов, но вы можете создать свой собственный, заключив допустимые символы в квадратные скобки. Примеры: [dgefgh] соответствует d, g, e, f и т. Д., А [l-p] соответствует l, m, n, o & p.

    Классы символов с отрицанием указывают, какие символы неприемлемы в шаблоне.l-p] означает, что l, m, n, o и p недопустимы.

    А теперь давайте кратко рассмотрим основные возможности, которые позволяют регулярные выражения.

    Синтаксис Пример Будет соответствовать Описание
    az [az] a, b, c, d и т. Д. Представляет все и любое количество символов нижнего регистра
    AZ [AZ] A, B, C и т. Д.cat $ Указывает, что шаблон должен соответствовать началу и концу строки
    | cat | dog Обозначает альтернативный образец (означает «Или»)
    . ct cat, cot, cut, c8t и т. Д. Представляет любой отдельный символ, кроме новой строки
    \ i \ icat cat, CAT, cAt, CAt и т. Д. Представляет нечувствительность к регистру
    \ b \ bcat кошка (не рогоз, кошки и т. Д.) Представляет «Границу слова» (без дополнительных символов)
    \ d c \ dt c0t, c1t, c2t, c3t, c4t, c5t и т. Д. Представляет любую одиночную цифру (0–9)
    \ D c \ Dt cat, cot, cut и т. Д. Представляет любой одиночный символ, кроме цифры (az)
    \ w c \ wt cat, c9t, c_t и т. д. обозначает любую букву, цифру и подчеркивание
    \ W c \ Wt c $ t, c @ t, c & t и т. д. Представляет любой символ, кроме символов слова
    \ s c \ st ct Представляет любые пробелы, такие как пробел, перевод строки или табуляция
    \ S c \ St cat, c9t, c_t и т. д. Представляет любой символ, кроме символа пробела
    \ c \ .t ct Экранирует специальные символы, чтобы их можно было использовать в шаблоне для представления самих себя
    () (cat) Используется для группировки параметров вместе путем захвата подшаблонов
    [] [abcde] Используется для объединения параметров вместе путем формирования классов
    + cat + Средство Что должно быть одно или несколько вхождений предшествующего символа или выражения
    * cat * 9 0023 означает, что предшествующий символ или выражение должно встречаться больше нуля или больше
    ? кот? Означает, что предшествующего символа или выражения должно быть ноль или одно вхождение.
    {} cat {2} Означает, что должно быть определенное число (2) вхождений предшествующего символа или Выражение
    {} cat {5,7} Означает, что должно быть определенное число (от 5 до 7) вхождений предшествующего символа или выражения

    Теперь, когда у вас есть все Из того, что запомнили, давайте перейдем к нашему долгожданному примеру, где мы определим, использует ли адрес электронной почты правильный синтаксис.[_a-z0-9 -] + (\. [_ a-z0-9 -] +) * @ [a-z0-9 -] + (\. [a-z0-9 -] +) * (\. [az] {2,3}) $ / ";
    если (preg_match ($ выражение, $ электронная почта)) {
    echo "Формат письма правильный!";
    } else {
    echo "Неверный формат электронной почты!";
    }
    ?>

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

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

    Это не руководство по созданию регулярных выражений (хотя я бы хотел его создать). Это несколько регулярных выражений, которые я сделал некоторое время назад, когда у меня был доступ к списку имен, адресов, номеров телефонов и т. Д. Они были отформатированы по-разному (в частности, номера телефонов), поэтому более простые регулярные выражения, которые Я до этого пользовался, надо было доработать.Я также говорю об использовании этих регулярных выражений для проверки полей ввода в сценариях PHP .

    Итак, приступим к

    Темы
    Что это за регулярные выражения?
    Регулярные выражения
    Как использовать эти регулярные выражения в PHP
    Ресурсы
    Ссылки
    Сноски

    Что это за регулярные выражения?

    Если мы сравним несколько строк текста, относящихся к одному и тому же предмету, с одинаковыми именами и фамилиями, мы увидим, что возникают закономерности.Некоторые очевидные из них заключаются в том, что имя всегда отделяется пробелом от фамилии, первый символ всегда в верхнем регистре, всегда есть одна фамилия, но может быть более одного имени. Регулярное выражение - это форма компьютерного языка, которая позволяет нам определять эти шаблоны, а затем программа, называемая синтаксическим анализатором, идентифицирует эти шаблоны внутри заданного текста. Как обычно, xkcd прекрасно это объясняет: http://xkcd.com/208/

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

    Название

    [a-zA-ZÀ-ÖØ-öø-ÿ] + \.? ((| \ -) ​​[a-zA-ZÀ-ÖØ-öø-ÿ] + \.?) *

    Я считаю, что это регулярное выражение работает для большинства имен с иностранными символами, или, по крайней мере, оно работает со всем, что у меня было, оно также позволяет использовать составные имена (например, Sackville-Baggins). Мора, чем использовать это для поиска имен внутри текста, должна использоваться для проверки имен, предоставленных пользователем, многие слова будут совпадать.

    Название улицы

    [a-zA-Z1-9À-ÖØ-öø-ÿ] + \.? ((| \ -) ​​[a-zA-Z1-9À-ÖØ-öø-ÿ] + \.?) *

    Если вам нужно иметь отдельные поля адреса для названия улицы и номера, это проверяет только название улицы. Это очень похоже на предыдущий пример, только позволяет нам использовать числа. Как и в предыдущем примере, это нужно использовать при проверке того, что нам дает пользователь.

    Название улицы с внешним и дополнительным внутренним номером

    [a-zA-Z1-9À-ÖØ-öø-ÿ] + \.? ((| \ -) ​​[a-zA-Z1-9À-ÖØ-öø-ÿ] + \.?) * (((# | [nN] [oO] \.?)?)? \ d {1 , 4} ((? [A-zA-Z0-9 \ -] +) +)?)

    Это на тот случай, если вам нужно проверить адрес полностью.

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

    Телефонный номер

    ([\ +]? [\ D] {1,4}?)? ([\ (] ([\ D] {2,3}) [)]?)? [0-9] [0- 9 \ -] {6,} (? ([XX] | ([eE] xt [\.]?))? ([\ D] {1,5}))?

    Допустимые форматы телефона:
    +52 (55) 55555555
    0052 (55) 55555555
    (55) 55555555
    55555555
    55-555-555
    01-800-765-8786
    55555555 x23
    5555-5555 Ext 23
    55555555 доб23
    5555-5555x43
    55555555внеш 26
    +52 (55) 5555-5555 доб 134

    Имя пользователя

    [a-zA-Z] ((\.| _ | -)? [a-zA-Z0-9] +) {3}

    Это обычное имя пользователя, оно должно начинаться с буквенно-цифрового символа, оно должно быть не менее 4 символов (вы можете контролировать длину, выбрав желаемую минимальную длину, вычтя из нее единицу и поместив это число между последними фигурными скобками), он может содержать числа, но не начинаться с единицы. И он может содержать символы подчеркивания, точки или тире, но не в начале и в конце, или иметь более одного вместе ( ae__ , ae_- и ae._ будет недействительным).

    Электронная почта

    [a-z0-9 _ \ -] + (\. [_ A-z0-9 \ -] +) * @ ([_ a-z0-9 \ -] + \.) + ([Az] {2} | aero | asia | arpa | biz | cat | com | coop | edu | gov | info | int | jobs | mil | mobi | museum | name | net | org | pro | tel | travel | xxx)

    В связи с недавними изменениями, предложенными ICANN, это регулярное выражение, скорее всего, изменится, поскольку ICANN планирует продавать новые домены верхнего уровня. Если это так, может оказаться непрактичным проверять каждый существующий домен верхнего уровня внутри регулярного выражения, лично я могу просто проверить форматирование, извлечь домен верхнего уровня и выполнить поиск в базе данных доменов верхнего уровня. , но мы еще не достигли этого, так что пока это должно работать нормально.Вы можете добавить | лук после xxx, если вам нужно использовать сеть tor, или | bit, если вы используете битовое имя экспериментального сервера имен.

    Кроме того, если вы используете домены, допускающие использование интернационализированных доменных имен, вам может потребоваться добавить дополнительные допустимые символы в регулярное выражение. В будущем я могу создавать новые строки, подходящие для разных регионов, проверять статью или отправлять мне сообщение в контактной форме на странице «Контакты», если у вас есть какие-либо комментарии по этому поводу.

    Номер RFC (Федеральный реестр участников, мексиканское значение)

    [AZ] {3,4} [\ -]? [0-9] {2} ((0 {1} [1-9] {1}) | (1 {1} [0-2] { 1})) ((0 {1} [1-9] {1}) | ([1-2] {1} [0-9] {1}) | (3 {1} [0-1] { 1})) [\ -]? [A-Z0-9] {3}

    Как использовать эти регулярные выражения в PHP

    Чтобы использовать регулярные выражения в PHP , мы используем функцию preg_match () .[a-zA-Z0-9 _ \ -] + (\. [_ a-zA-Z0-9 \ -] +) * $ / D ';
    if (preg_match ($ regex, $ string)) {
    echo "Строка действительна";
    } else {
    echo "Неверная строка";
    }
    ?>

    ресурсов

    Небольшой (и простой) скрипт, который я написал для проверки регулярных выражений

    test_regex.tar.g
    Размер: 2788 байтов
    MD5: 7cbb13893004e7b7fcdac3aebd63fc1a
    SHA1: 5e5be779a03fc1481782062ccac2b346ddfb0382
    как Лицензия: 9059D BS0382
    как

    Если вы отметите поле с надписью «Многострочный», он разделит содержимое текстового поля на несколько строк и будет проверять каждую строку отдельно, в противном случае он будет оценивать все содержимое текстового поля.

    Список литературы

    Карманный справочник регулярных выражений

    (книга)
    http://www.php.net/manual/en/function.preg-match.php

    Сноски

    Это еще одна из тех тем, которые мне нравятся. Я хотел бы иметь большие наборы данных для анализа, но обычно этого не происходит. Так что я делаю некоторые, когда могу их учить. Если у вас есть комментарий по этому поводу или вы хотите создать регулярное выражение, отправьте мне электронное письмо или сообщение в моей контактной форме в разделе «Контакты».

    Изначально я собирался порекомендовать надстройку Firefox «Тестер регулярных выражений», но она подвела меня для некоторых сложных выражений, которые я считаю странными, поскольку я помню, как я тестировал некоторые из них тогда с этим надстройкой Firefox. Итак, я сделал небольшой скрипт для проверки регулярных выражений, который я опубликовал здесь.

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

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

    Самый важный набор функций регулярных выражений начинается с preg. Эти функции представляют собой оболочку PHP вокруг библиотеки PCRE (Perl-совместимые регулярные выражения). Все, что говорится о разновидности регулярных выражений PCRE в руководстве по регулярным выражениям на этом веб-сайте, относится к функциям preg PHP. Когда в руководстве конкретно говорится о PHP, предполагается, что вы используете функции preg. Вы должны использовать функции preg для всего нового кода PHP, который использует регулярные выражения. PHP включает PCRE по умолчанию, начиная с PHP 4.2.0 (апрель 2002 г.).

    Самый старый набор функций регулярных выражений - это те, которые начинаются с ereg. Они реализуют расширенные регулярные выражения POSIX, такие как традиционная команда egrep UNIX. Эти функции в основном предназначены для обратной совместимости с PHP 3. Они официально объявлены устаревшими, начиная с PHP 5.3.0. Многие из более современных функций регулярных выражений, такие как ленивые квантификаторы, поиск и Unicode, не поддерживаются функциями ereg. Не позволяйте «расширенному» прозвищу ввести вас в заблуждение. Стандарт POSIX был определен в 1986 году, и с тех пор регулярные выражения прошли долгий путь.

    Последний набор представляет собой вариант набора ereg с префиксом mb_ для «многобайтовости» в именах функций. В то время как ereg обрабатывает регулярное выражение и строку темы как серию 8-битных символов, mb_ereg может работать с многобайтовыми символами из различных кодовых страниц. Если вы хотите, чтобы ваше регулярное выражение обрабатывало символы Дальнего Востока как отдельные символы, вам нужно либо использовать функции mb_ereg, либо функции preg с модификатором / u. mb_ereg доступен в PHP 4.2.0 и новее. Он использует тот же аромат POSIX ERE.

    Набор функций preg

    Все функции preg требуют, чтобы вы указали регулярное выражение в виде строки с использованием синтаксиса Perl. В Perl / regex / определяет регулярное выражение. В PHP это становится preg_match ('/ regex /', $ subject). Когда косая черта используется в качестве разделителя регулярных выражений, любые косые черты в регулярном выражении должны быть экранированы обратной косой чертой. Таким образом, http: // www \ .jgsoft \ .com / становится '/http:\/\/www\.jgsoft\.com\//'. Как и Perl, функции preg допускают использование любых не буквенно-цифровых символов в качестве разделителей регулярных выражений.Регулярное выражение URL было бы более читабельным как "% http: // www \ .jgsoft \ .com /%" с использованием знаков процента в качестве разделителей регулярных выражений, поскольку в этом случае вам не нужно экранировать косую черту. Вам нужно будет избежать процентных знаков, если регулярное выражение их содержит.

    В отличие от языков программирования, таких как C # или Java, PHP не требует экранирования всех обратных косых черт в строках. Если вы хотите включить обратную косую черту в качестве буквального символа в строку PHP, вам нужно только экранировать ее, если за ней следует другой символ, который необходимо экранировать.В строках с одинарными кавычками нужно экранировать только одинарные кавычки и обратную косую черту. Вот почему в приведенном выше регулярном выражении мне не нужно было удваивать обратную косую черту перед буквальными точками. Регулярное выражение \\ для соответствия одиночной обратной косой черте станет '/ \\\\ /' в качестве строки preg PHP. Если вы не хотите использовать интерполяцию переменных в регулярном выражении, вы всегда должны использовать строки в одинарных кавычках для регулярных выражений в PHP, чтобы избежать беспорядочного дублирования обратной косой черты.

    Чтобы указать параметры сопоставления регулярных выражений, такие как нечувствительность к регистру, указываются так же, как в Perl.'/ regex / i' применяет регистр регулярных выражений без учета регистра. '/ regex / s' заставляет точку соответствовать всем символам. '/ regex / m' заставляет привязки начала и конца строки совпадать во встроенных символах новой строки в строке темы. '/ regex / x' включает режим свободного интервала. Вы можете указать несколько букв, чтобы включить несколько опций. '/ regex / misx' включает все четыре параметра.

    Специальная опция - это / u, которая включает режим сопоставления Unicode вместо 8-битного режима сопоставления по умолчанию. Вы должны указать / u для регулярных выражений, которые используют \ x {FFFF}, \ X или \ p {L} для соответствия символам Unicode, графемам, свойствам или скриптам.PHP интерпретирует '/ regex / u' как строку UTF-8, а не как строку ASCII.

    Как и функция ereg, bool preg_match (шаблон строки, тема строки [, группы массивов]) возвращает ИСТИНА, если шаблон регулярного выражения соответствует строке темы или части строки темы. Если вы укажете третий параметр, preg сохранит подстроку, соответствующую первой группе захвата, в $ groups [1]. $ groups [2] будет содержать вторую пару и так далее. Если в шаблоне регулярного выражения используется именованный захват, вы можете получить доступ к группам по имени с помощью $ groups ['name'].$ groups [0] проведут общий матч.

    int preg_match_all (шаблон строки, тема строки, совпадения массива, флаги int) заполняет массив «совпадений» всеми совпадениями шаблона регулярного выражения в строке темы. Если вы укажете PREG_SET_ORDER в качестве флага, тогда $ match [0] будет массивом, содержащим совпадение и обратные ссылки первого совпадения, точно так же, как массив $ groups, заполненный preg_match. $ match [1] содержит результаты для второго совпадения и так далее. Если вы укажете PREG_PATTERN_ORDER, тогда $ match [0] будет массивом с полными последовательными совпадениями регулярных выражений, $ match [1] массивом с первой обратной ссылкой из всех совпадений, $ match [2] массивом со второй обратной ссылкой каждого совпадения, и т.п.

    array preg_grep (шаблон строки, субъекты массива) возвращает массив, содержащий все строки в массиве «субъектов», которые могут быть сопоставлены шаблоном регулярного выражения.

    смешанный preg_replace (смешанный шаблон, смешанная замена, смешанный предмет [, int limit]) возвращает строку со всеми совпадениями с шаблоном регулярного выражения в строке темы, замененной строкой замены. Производятся не более лимитные замены. Одно из ключевых отличий заключается в том, что все параметры, кроме limit, могут быть массивами, а не строками.В этом случае preg_replace выполняет свою работу несколько раз, одновременно выполняя итерацию по элементам в массивах. Вы также можете использовать строки для одних параметров и массивы для других. Затем функция будет перебирать массивы и использовать одни и те же строки для каждой итерации. Использование массива шаблона и замены позволяет выполнять последовательность операций поиска и замены в одной строке темы. Использование массива для строки темы позволяет выполнять одну и ту же операцию поиска и замены для многих строк темы.

    preg_replace_callback (смешанный шаблон, замена обратного вызова, смешанный предмет [, ограничение int]) работает так же, как preg_replace, за исключением того, что второй параметр принимает обратный вызов вместо строки или массива строк. Функция обратного вызова будет вызываться для каждого совпадения. Обратный вызов должен принимать один параметр. Этот параметр будет массивом строк, в котором элемент 0 содержит общее совпадение регулярного выражения, а другие элементы - текст, сопоставленный захваченными группами. Это тот же массив, что и в preg_match.Функция обратного вызова должна возвращать текст, которым должно быть заменено совпадение. Верните пустую строку, чтобы удалить совпадение. Верните $ groups [0], чтобы пропустить это совпадение.

    Обратные вызовы

    позволяют выполнять мощные операции поиска и замены, которые нельзя выполнить с помощью одних только регулярных выражений. Например. если вы ищете регулярное выражение (\ d +) \ + (\ d +), вы можете заменить 2 + 3 на 5, используя обратный вызов:

     function regexadd ($ groups) {
      вернуть $ groups [1] + $ groups [2];
    } 

    array preg_split (шаблон строки, тема строки [, ограничение int]) работает так же, как split, за исключением того, что он использует синтаксис Perl для шаблона регулярного выражения.

    См. Руководство по PHP для получения дополнительной информации о наборе функций preg

    .

    Набор функций ereg

    Функции ereg требуют, чтобы вы указали регулярное выражение в виде строки, как и следовало ожидать. ereg ('regex', «subject») проверяет соответствие регулярного выражения subject. При передаче регулярного выражения в виде буквальной строки следует использовать одинарные кавычки. Некоторые специальные символы, такие как доллар и обратная косая черта, также являются специальными символами в строках PHP с двойными кавычками, но не в строках с одинарными кавычками.

    int ereg (шаблон строки, тема строки [, группы массивов]) возвращает длину совпадения, если шаблон регулярного выражения соответствует строке темы или части строки темы, или ноль в противном случае. Поскольку ноль оценивается как False, а ненулевое значение - как True, вы можете использовать ereg в операторе if для проверки совпадения. Если вы укажете третий параметр, ereg сохранит подстроку, совпадающую с частью регулярного выражения между первой парой круглых скобок в $ groups [1].$ groups [2] будет содержать вторую пару и так далее. Обратите внимание, что круглые скобки только для группировки не поддерживаются ereg. ereg чувствителен к регистру. eregi - нечувствительный к регистру эквивалент.

    строка ereg_replace (шаблон строки, замена строки, тема строки) заменяет все совпадения шаблона регулярного выражения в строке темы на заменяющую строку. Вы можете использовать обратные ссылки в строке замены. \\ 0 - это полное совпадение регулярного выражения, \\ 1 - первая обратная ссылка, \\ 2 - вторая и т. Д.Максимально возможная обратная ссылка \\ 9. ereg_replace чувствителен к регистру. eregi_replace - эквивалент без учета регистра.

    array split (string pattern, string subject [, int limit]) разбивает предметную строку на массив строк с использованием шаблона регулярного выражения. Массив будет содержать подстроки между совпадениями регулярных выражений. Фактически совпавший текст отбрасывается. Если вы укажете ограничение, результирующий массив будет содержать не более указанного количества подстрок.Строка темы будет разделена не более чем limit-1 раз, а последний элемент в массиве будет содержать неразделенный остаток строки темы. split чувствителен к регистру. spliti - нечувствительный к регистру эквивалент.

    См. Руководство по PHP для получения дополнительной информации о наборе функций ereg

    .

    Набор функций mb_ereg

    Функции mb_ereg работают точно так же, как функции ereg, с одним ключевым отличием: в то время как ereg обрабатывает регулярное выражение и строку темы как серию 8-битных символов, mb_ereg может работать с многобайтовыми символами из различных кодовых страниц.Например. закодировано с помощью кодовой страницы Windows 936 (упрощенный китайский), слово 中国 («Китай») состоит из четырех байтов: D6D0B9FA. Использование функции ereg с регулярным выражением. в этой строке в результате будет получен первый байт D6. Точка соответствует ровно одному байту, поскольку функции ereg ориентированы на байты. Использование функции mb_ereg после вызова mb_regex_encoding ("CP936") приведет к получению байтов D6D0 или первого символа 中.

    Чтобы убедиться, что ваше регулярное выражение использует правильную кодовую страницу, вызовите mb_regex_encoding (), чтобы установить кодовую страницу.Если вы этого не сделаете, вместо этого будет использоваться кодовая страница, возвращаемая или установленная mb_internal_encoding ().

    Если ваш сценарий PHP использует UTF-8, вы можете использовать функции preg с модификатором / u для сопоставления многобайтовых символов UTF-8 вместо отдельных байтов. Функции preg не поддерживают другие кодовые страницы.

    См. Руководство по PHP для получения дополнительной информации о наборе функций mb_ereg

    .

    Дополнительная литература

    Книга «Освоение регулярных выражений» не только объясняет все, что вы хотите знать и не хотите знать о регулярных выражениях.В нем также есть отличная глава, посвященная набору функций PHP preg, с подробностями о базовом механизме регулярных выражений PCRE и множеством примеров кода PHP, демонстрирующих более сложные методы. В книге не рассматриваются наборы функций ereg и mb_ereg.

    Моя рецензия на книгу Освоение регулярных выражений

    Сделайте пожертвование

    Этот веб-сайт только что сэкономил вам поездку в книжный магазин? Сделайте пожертвование в поддержку этого сайта, и вы получите неограниченного доступа к этому сайту без рекламы!

    PHP Регулярные выражения, легкость в изучении Регулярных выражений Учебник на PHP

    PHP Регулярные выражения очень полезны для веб-разработчиков.

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

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

    • Регулярные выражения POSIX
    • Регулярные выражения PERL

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

    Чтобы использовать регулярные выражения posix, сначала необходимо изучить синтаксис. Символ с циркумфлексом отмечает начало узора, хотя в некоторых случаях его можно опустить $ То же, что и с циркумфлексом, знак доллара отмечает конец поискового шаблона. Точка соответствует любому одиночному символу? Соответствует предыдущему шаблону ноль или один раз + Он будет соответствовать предыдущему шаблону один или несколько раз * Соответствует предыдущему шаблону ноль или более раз | Логическое ИЛИ – Соответствует ряду элементов () Группирует различные элементы узора вместе [] Соответствует любому одиночному символу в квадратных скобках. {мин., Макс.} Используется для соответствия точному количеству символов \ d Соответствует любой отдельной цифре \ D Соответствует любому нецифровому символу \ w Соответствует любому буквенно-цифровому символу, включая подчеркивание (_). \ Вт Соответствует любому не буквенно-цифровому символу, за исключением символа подчеркивания \ с Соответствует пробельному символу

    В качестве дополнения в PHP символ косой черты экранирован простой косой чертой \.узнать / Он будет соответствовать узнать в начале строки. Возможные совпадения: learn или learnworld , но не worldlearn ‘/ learn $ /’ Будет соответствовать и узнать в конце строки. ‘/le.n/’ Соответствует любому символу от le до n . ‘/ le? Arn /’ Соответствует либо arn , либо узнать ‘/ learn + /’ Будет соответствовать , выучить раз или больше. Например. учиться или учиться ‘/ le * arn /’ Соответствует arn , learn или lelearn , но не learnoo ‘/ learn | world /’ Он будет соответствовать слову выучить или мир ‘/ (A-Z) /’ Используя его с символом дефиса, этот шаблон будет соответствовать каждому символу верхнего регистра от A до Z.Например. A, B, C… ‘/ [abc] /’ Соответствует любому одиночному символу a , b или c ‘/ abc {1} /’ Соответствует ровно одному символу c после символов ab . Например. соответствует abc , но не abcc ‘/ abc {1,} /’ Соответствует одному или нескольким символам c после символов ab .Например. соответствует abc или abcc ‘/ abc {2,4} /’ Соответствует от двух до четырех c символ после символов ab . Например. соответствует abcc , abccc или abcccc , но не abc

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

    Регулярные выражения обычно известны как regex .) для создания сложных выражений.

    По умолчанию регулярные выражения чувствительны к регистру .

    Преимущества и использование регулярного выражения

    Регулярное выражение используется почти везде в современном прикладном программировании. Ниже приведены некоторые преимущества и способы использования регулярных выражений:

    1. Регулярное выражение помогает программистам проверять текстовую строку.
    2. Он предлагает мощный инструмент для анализа и поиска шаблона, а также для изменения текстовой строки.
    3. С помощью функций регулярных выражений предоставляются простые и легкие решения для идентификации шаблонов.
    4. Регулярные выражения полезны для создания системы шаблонов HTML, распознающих теги.
    5. Регулярные выражения широко используются для обнаружения браузером, проверки форм, фильтрации спама и проверки надежности пароля.
    6. Это полезно при проверке пользовательского ввода, например адреса электронной почты, номера мобильного телефона и IP-адреса.
    7. Это помогает выделить специальные ключевые слова в файле на основе результата поиска или ввода.xyz] означает НЕ x, y или z.
    Находит диапазон между элементами, например. , [a-z] означает от a до z.
    | Это логический оператор ИЛИ, который используется между элементами. Например. , a | b, что означает либо ИЛИ b.
    ? Указывает ноль или один из предыдущего символа или диапазона элементов.
    * Указывает ноль или более предыдущего символа или диапазона элементов.
    + Указывает ноль или более предыдущего символа или диапазона элементов.
    {n} Обозначает не менее n раз предыдущего диапазона символов. Например - n {3}
    {n,} Обозначает не менее n, но не должно быть больше m раз, например, n {2,5} означает от 2 до 5 из n.
    {n, m} Указывает не менее n, но не более m раз.Например, n {3,6} означает от 3 до 6 из n.
    \ Обозначает escape-символ.

    Класс специальных символов в регулярном выражении

    Специальный символ Описание
    \ п Указывает на новую строку.
    \ r Указывает на возврат каретки.
    \ т Представляет собой вкладку.
    \ v Представляет собой вертикальную табуляцию.
    \ f Представляет собой подачу страницы.
    \ xxx Представляет восьмеричный символ.
    \ xxh Обозначает шестнадцатеричный символ hh.

    PHP предлагает два набора функций регулярных выражений:

    1. Регулярное выражение POSIX
    2. Регулярное выражение стиля PERL

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

    Структура регулярного выражения POSIX аналогична типичному арифметическому выражению: несколько операторов / элементов объединяются вместе для образования более сложных выражений.

    Самое простое регулярное выражение - это выражение, которое соответствует одному символу внутри строки. Например - «g» внутри тумблера или цепочки. Давайте познакомимся с некоторыми концепциями, используемыми в регулярном выражении POSIX:

    Кронштейны

    Скобки [] имеют особое значение, когда они используются в регулярных выражениях. Они используются, чтобы найти диапазон символов внутри него.

    Выражение Описание
    [0-9] Соответствует любой десятичной цифре от 0 до 9.
    [а-я] Соответствует любому символу нижнего регистра от a до z.
    [А-Я] Соответствует любому прописному символу от A до Z.
    [а-я] Соответствует любому символу от нижнего a до верхнего Z.

    Обычно используются указанные выше диапазоны. Вы можете использовать значения диапазона в соответствии с вашими потребностями, например [0-6], чтобы соответствовать любой десятичной цифре от 0 до 6.

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

    Специальный символ может обозначать позицию заключенных в квадратные скобки последовательностей символов и отдельных символов. Каждый специальный символ имеет определенное значение. Все указанные флаги символов +, *,?, $ И {int range} следуют за последовательностью символов.

    Выражение Описание
    п + Соответствует любой строке, содержащей хотя бы один p.
    п * Соответствует любой строке, содержащей один или несколько p.
    п? Соответствует любой строке, содержащей ноль или один p.
    p {N} Соответствует любой строке, имеющей последовательность из N p.
    п {2,3} Соответствует любой строке, состоящей из двух или трех p.
    п {2,} Соответствует любой строке, содержащей как минимум два p.п Соответствует любой строке с буквой p в начале.

    Функция PHP Regexp POSIX

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

    Функция Описание
    ereg () Он ищет шаблон строки внутри другой строки и возвращает истину, если шаблон совпадает, в противном случае возвращает ложь.
    ereg_replace () Он ищет образец строки внутри другой строки и заменяет соответствующий текст строкой замены.
    eregi () Он ищет шаблон внутри другой строки и возвращает длину совпавшей строки, если она найдена, в противном случае возвращает false. Это функция , нечувствительная к регистру.
    eregi_replace () Эта функция работает так же, как функция ereg_replace () .Единственное отличие состоит в том, что поиск шаблона этой функции нечувствителен к регистру.
    раздельный () Функция split () делит строку на массив.
    spliti () Она похожа на функцию split (), поскольку она также делит строку на массив с помощью регулярного выражения.
    Sql_regcase () Он создает регулярное выражение для совпадения без учета регистра и возвращает допустимое регулярное выражение, которое будет соответствовать строке.
    Примечание. Обратите внимание, что указанные выше функции устарели в PHP 5.3.0 и удалены в PHP 7.0.0.

    Регулярное выражение стиля PERL

    Регулярные выражения в стиле Perl очень похожи на POSIX. Синтаксис POSIX может взаимозаменяемо использоваться с функцией регулярного выражения в стиле Perl. Квантификаторы, представленные в разделе POSIX, также могут использоваться в регулярных выражениях стиля PERL.

    Метасимволы

    Метасимвол - это алфавитный символ, за которым следует обратная косая черта, придающая комбинации особое значение.

    Например, - метасимвол '\ d' может использоваться для поиска крупных денежных сумм: / ([\ d] +) 000 /. Здесь / d будет искать строку числовых символов.

    Ниже приведен список метасимволов, которые можно использовать в регулярных выражениях стиля PERL -

    . будет соответствовать границе новой строки, а не границе строки.

    Персонаж Описание
    . Соответствует одиночному символу
    \ с Соответствует пробелу, например пробелу, новой строке, табуляции.
    \ S Непробельный символ
    \ d Соответствует любой цифре от 0 до 9.
    \ D Соответствует нецифровому символу.
    \ w Соответствует символу слова, например - a-z, A-Z, 0-9, _
    или Оценивает выражение только один раз
    с Он позволяет использовать. (Точка) для соответствия символу новой строки
    x Этот модификатор позволяет нам использовать пробелы в выражении для ясности.
    г Он ищет все совпадения во всем мире.
    кг Позволяет продолжить поиск даже после сбоя глобального совпадения.

    Функция PHP Regexp POSIX

    В настоящее время PHP предоставляет семь функций для поиска строк с использованием регулярного выражения в стиле POSIX -

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

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

    В этом руководстве вы узнаете о регулярном выражении PHP и его применении на практических примерах.

    Регулярное выражение PHP - это последовательность символов, используемая для функции сопоставления с образцом. Используя регулярное выражение, вы можете найти конкретную строку в другой строке. Замените одну строку другой строкой, используя регулярное выражение. и вы можете разделить строку на множество частей. PHP предлагает множество функций в рамках функции сопоставления с образцом.

    Есть 2 типа регулярных выражений:

    • Расширенный POSIX
    • Perl-совместимый

    ereg, eregi,… - версии POSIX, а preg_match, preg_replace,… - версия Perl.Важно, чтобы при использовании регулярных выражений, совместимых с Perl, выражение должно быть заключено в разделители, например, в косую черту (/). Однако эта версия мощнее и быстрее, чем POSIX.

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

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

    • Обычные символы, которые соответствуют друг другу, например, hello
    • Начальные и конечные индикаторы как ^ и
    • долларов

    • Подсчитайте индикаторы, такие как +, * ,?
    • Логический оператор like |
    • Группировка с помощью {}, (), []

    Пример шаблона для проверки действительных электронных писем выглядит следующим образом:

    ^ [a-zA-Z0-9.[a-zA-Z0-9 ._-] + @ [a-zA-Z0-9 -] + \. [a-zA-Z.] {2,5} $

    Функция Описание
    ereg_replace () Функция ereg_replace () находит строку, указанную шаблоном, и заменяет шаблон заменой, если найдена.
    eregi_replace () Функция eregi_replace () работает аналогично функции ereg_replace (), за исключением того, что поиск шаблона в строке не чувствителен к регистру.
    preg_replace () Функция preg_replace () работает аналогично ereg_replace (), за исключением того, что во входных параметрах шаблона и замены можно использовать регулярные выражения.
    preg_match () Функция preg_match () находит строку в шаблоне и возвращает истину, если шаблон совпадает с ложью, в противном случае.
    Выражение Описание
    [0-9] Соответствует любой десятичной цифре от 0 до 9.
    [а-я] Соответствует любому символу от строчного a до строчного z.
    [А-Я] Соответствует любому символу от A до Z в верхнем регистре.
    [а-я] Соответствует любому символу от нижнего а до верхнего Z.
    п + Соответствует любой строке, содержащей хотя бы один p.
    п * Соответствует любой строке, содержащей ноль или более p.
    п? Соответствует любой строке, содержащей ноль или более p. Это просто альтернативный способ использования p *.
    п {N} Соответствует любой строке, содержащей последовательность из N p.
    п {2,3} Соответствует любой строке, содержащей последовательность из двух или трех p.
    п {2,} Соответствует любой строке, содержащей последовательность не менее двух p.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    2024 © Все права защищены. Карта сайта