Регулярные выражения в php для чайников. Регулярные выражения в PHP с примерами. Валидация с помощью регулярных выражений

1.6K

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

Краткая история

  • Все началось в 1940 — 1960-х годах, когда множество умных людей говорили о регулярных выражениях;
  • 1970-е годы g / re / p;
  • 1980 Perl и Генри Спенсер;
  • 1997 PCRE (регулярные выражения, совместимые с Perl). Именно тогда начался взлет того, что мы называем регулярные выражения. PCRE предоставляет библиотеки почти для каждого языка.
Общее использование регулярных выражений в PHP

PHP включает в себя три основные функции для работы с PCRE — preg_match , preg_match_all и preg_replace .

Сравнение соответствия

Выражение возвращает 1 , если соответствие установлено, 0 — если нет, и false — если возникает ошибка:

int preg_match (string $pattern, string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]])

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

int preg_match_all (string $pattern, string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

Замена

Выражение возвращает замененную строку или массив (на основе объекта $subject ):

mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int $count ]])

Общее использование регулярных выражений в JavaScript

Регулярные выражения в JavaScript выглядят почти так же, как и в PHP .

Сравнение соответствия

Возвращает массив совпадений или null , если совпадений не найдено:

string.match(RegExp);

Замена

Регулярное выражение, которое возвращает строку с выполненными заменами:

string.replace(RegExp, replacement);

Особенности регулярных выражений в JavaScript
  • Точка никогда не соответствует новой строке:
  • Те же методы для сравнения соответствия и замены через регулярное выражение, что и без них.
Принципы составления шаблонов регулярных выражений

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

Аналоговые сокеты

Регулярные выражения состоят из двух типов символов:

  • специальные символы: ? * + {} () ^ $ / .
  • Литералы.

Представьте себе входные строки как болты, а шаблон — как набор разъемов для них (в соответствующем порядке).

Специальные символы

При проверке регулярных выражений нужно знать, как работают специальные символы:

  • Символ обратной косой черты \ может заменять другой специальный символ в регулярном выражении:
  • Точка и w — .

Совпадение со всеми символами, кроме новых строк. Если хотите проверить на соответствие точке, и только точке — , на соответствие буквам, цифрам и нижнему подчеркиванию — w

  • Квадратные скобки .

Совпадение с символами внутри скобок. Поддерживает диапазоны. Некоторые примеры:
o — соответствует любым a, b или c.
o прописные буквы.
o любая цифра.
o — соответствует любому буквенному символу в нижнем или верхнем регистре.
Опционально? Соответствие 0 или 1.
Звездочка *.

Звездочка обозначает 0 или более символов.

Соответствие 1 или более символам.

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

Минимальное и максимальное значения. Некоторые примеры синтаксиса регулярных выражений:
o {1,} не менее 1.
o {1,3} от 1 до 3.
o {1,64} от 1 до 64.

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

/+@+(.+)*/i


Как это выглядит в PHP :

preg_match_all("/+@+(.+)*/i", $input_lines, $output_array);

Использование регулярного выражения для валидации

Задача : убедиться, что вводимые данные — это то, что мы ожидаем. Цель 1 : /[^w$.]/ Цель 2: /^{1,2}$/

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

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

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

filter_var("[email protected]", FILTER_VALIDATE_EMAIL)

Валидация с помощью регулярных выражений

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

^ — указывает начало строки.
$ — знак доллара, который указывает конец строки.

if (!preg_match("%^{1,2}$%", $_POST["subscription_frequency"])) { $isError = true; }

Исключенные классы символов

[^abc] — все, кроме a , b или c , включая новые строки.

Пример, который обеспечивает ввод только буквенно-цифровых символов, тире, точки, подчеркивания:

if (preg_match("/[^0-9a-z-_.]/i", $productCode)) { $isError = true; }

Поиск и замена

Наиболее распространенными функциями PCRE для выполнения поиска и замены являются preg_replace() и preg_replace_callback() . Но есть также preg_filter() и preg_replace_callback_array() , которые делают почти то же самое. Обратите внимание, что функция preg_replace_callback_array() доступна, начиная с PHP7 .

Заменить слова в списке

$subject = "I want to eat some apples."; echo preg_replace("/apple|banana|orange/", "fruit", $subject);

Результат

I want to eat some fruits.

Если в регулярном выражении есть подшаблоны (в круглых скобках ), можно заменить $N или N (где N является целым числом > = 1 ), это называется «обратная ссылка».

Перестановка двух чисел

$subject = "7/11"; echo preg_replace("/(d+)/(d+)/", "$2/$1", $subject);

Результат

Изменение форматирования даты

$subject = "2001-09-11"; echo preg_replace("/(d+)-(d+)-(d+)/", "$3/$2/$1", $subject);

Результат

Простой пример замены URL-адреса в теге

$subject = "Please visit https://php.earth/doc for more articles."; echo preg_replace("#(https?://([^s./]+(?:.[^s./]+)*[^s]*))#i", "$2", $subject);

Результат

Описание функции:

Функция preg_replace ищет совпадения регулярного выражения (pattern ) с данными в строке (subject) и заменяет их на данные находящиеся в replacement .

Аргумент

Описание

pattern

Обязательный аргумент. Регулярное выражение (шаблон поиска)

string, array

replacement

Обязательный аргумент. Строка или массив с данными используемыми для замены данных в subject

Также для ссылок можно использовать конструкцию вида \${1} равнозначную \$1, это конструкция используется если после ссылки идет сразу цифра (\${1}1).

string, array
subject Обязательный аргумент. Строка или массив с данными которые будут заменены. string, array
limit

Необязательный аргумент. Максимально количество замен. По умолчанию равно -1 (не ограниченно)

int
count

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

int

Функция preg_replace() может использоваться с модификатором / e. При наличии этого модификатора параметр replacement интерпретируется как PHP-код и затем используется для замены.

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

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

Достаточно хорошо описание регулярных выражений приводится на wikipedia.org , основные моменты применения регулярных выражений также описаны

Примеры: Пример 1: В этом примере заменяем все цифры помещенные в скобки на звездочки. Пример 2:

В этом примере заменяем строку соответствующую всему шаблону, данными соответствующими первой подмаске по ссылке \$1. Другими словами "have 3 apples", соответствующие "/(\w+) (\d+) (\w+)/", будет заменено на "have", соответствующее (\w+).

Пример 3:

В этом примере показано, что произойдет если в качестве pattern и replacement использовать массивы.

Пример 4:

В этом примере показано, что произойдет если в качестве pattern, replacement и subject использовать массивы.

Пример 5:

В этом примере показано использование модификатора / e, т.е когда replacement интерпретируется как php код. Ниже показано преобразование символов из нижнего в верхний регистр.

Пример 6:

В этом примере показано использование аргумента count. Здесь результат будет равен 2, так произошло две замены.

Давно хотел разобраться с регулярными выражениями. Хотя «разобраться» — громко сказано. Чтобы постичь великое искусство и стать повелителем регулярных выражений, нужно постоянно с ними иметь дело. Мало изучить синтаксис, спецсимволы и модификаторы, — нужно уметь ими пользоваться. А умение пользоваться приходит с опытом.

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

Таблица спецсимволов

Спецсимвол Описание
\ Символ экранирования. Пример: ‘/seo\/smo/’ — соответствует строке, в которой есть seo/smo.
^ Символ начала данных. Пример: ‘/^seo/’ — соответствует строке, которая начинается словом seo.
$ Символ конца данных. Пример: ‘/блог$/’ — соответствует строке, которая заканчивается словом блог.
. Любой символ, кроме перевода строки. Пример: ‘/seo.ult/’ — соответствует строке seopult, seo9ult, seo@ult и т.д.
Внутри этих скобок перечисляются символы, любой из которых может стоять на данном месте, но только один. Пример: ‘/seoult/’ — под соответствие попадут только строки, содержащие seopult, seokult или seomult.
| Или. Пример ниже.
() Подмаска.
? Одно или ноль вхождений предшествующего символа или подмаски.
* Любое количество вхождений предшествующего символа или подмаски. В том числе и ноль.
+ Одно или более вхождений.
Пример: ‘/se+(op|om)?.*t/’ — буква s, затем одна или несколько букв e, после этого сочетание op или om может встречаться один раз, а может и ни разу, потом любое количество любых символов и буква t.
{a,b} Количество вхождений предшествующего символа или подмаски от a до b. Пример: {0,} — то же самое, что *, {0,1} — то же, что?, {3,5} — 3, 4 или 5 повторений.

Простые примеры php скриптов с использованием регулярных выражений :

1) Предыдущие и последующие выражения.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Пример #2 Использование массивов с числовыми индексами в качестве аргументов функции preg_replace()

Результат выполнения данного примера:

The bear black slow jumped over the lazy dog.

Отсортировав по ключам шаблоны и замены, получаем желаемый результат:

Результат выполнения данного примера:

The slow black bear jumped over the lazy dog.

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

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 .

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

April1,2003

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

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


Пример 2. Использование массивов с числовыми индексами в качестве аргументов функции preg_replace()

Результат:

Результат:

The slow black bear jumped over the lazy dog.

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

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

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


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

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

Преобразует все HTML-теги к верхнему регистру


Пример 5. Конвертор HTML в текст