регулярные выражения, функция 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 — это элемент шаблона, тоже один символ, но только со значением от a до z — вся латиница в нижнем регистре. \.]+\.[a-z]{2,3}/ — вариант для распознавания e-mail.

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

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

PHP Live Regex

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

/ /

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

Замена

Строка (строки) поиска last_name, first_name Бьорге, Филипп Кардашьян, Ким Меркьюри, Фредди

  • preg_match
  • preg_match_all
  • preg_replace
  • прег_греп
  • preg_split

Памятка

9 Начало строки
$ Конец строки
Начало строки
Конец строки
. Любой одиночный символ
Любой пробел
Любой непробельный символ
Любая цифра
Любой нецифровой
Любой символ слова (буква, цифра, подчеркивание)
\Вт Любой символ, не являющийся словом
Граница любого слова
(...) Захватите все, что закрыто
(а|б) а или б
а? Ноль или один из
а* Ноль или более
а+
Один или несколько из
а{3} Ровно 3 из
а{3,} 3 или более из
а{3,6} Между 3 и 6 из

Опции

i без учета регистра м рассматривать как многострочную строку s точка соответствует новой строке x игнорировать пробелы в регулярном выражении

A соответствует только началу строки D соответствует только в конце строки U нежадное сопоставление по умолчанию

Поддерживает Филип Бьорге

Как лучше всего сопоставить preg_match() с шаблоном ввода HTML5 — PHP — Форумы SitePoint

kerry14

1

Я пытаюсь проверить поле пароля следующим образом:

Должен содержать хотя бы 1 верхний, хотя бы 1 нижний, хотя бы одну цифру и хотя бы один из ограниченного набора специальных символов. Он также должен быть от 8 до 30 в длину 9(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%_])[0-9A-Za-z!@ #$%_]{8,30}$/’, $string)) {

Сейчас я не силен в регулярных выражениях, но мне кажется, что на стороне сервера последняя секция регулярного выражения [0 -9A-Za-z!@#$%_] (непосредственно перед определением ограничений длины) должно быть избыточным, и кажется, что это не требуется для шаблона HTML5, но PHP preg_match() не работает без — нет сообщения об ошибке но он не проверяет правильно.

Также серверная сторона не требует точки. до ограничения длины 9


начало строки

(?=.*[a-z])
?= просмотр вперед соответствует любому символу . * до 30.6 нижнего регистра включительно [900] 36 символов нижнего регистра

(?=.*[A-Z])
просмотр вперед соответствует любому символу до и включая символ верхнего регистра [A-Z] .

(?=.*[0-9])
просмотр вперед соответствует любому символу до цифры 9 включительно&*_]

lookahead (lookaround)

Цитата из https://www.regular-expressions.info/lookaround.html

Разница в том, что поиск на самом деле соответствует символам, но затем отказывается от совпадения, возвращая только результат: совпадение или отсутствие совпадения. Вот почему они называются «утверждениями». Они не потребляют символы в строке, а только утверждают, возможно совпадение или нет.

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

Наконец

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

.{8,30}
соответствует любому символу . от 8 до 30 раз {8,30}

$
конец строки

Примечание. Когда я сказал, что опережающий поиск соответствует любому символу до включительно, это не совсем так. .* называется жадным. Он будет соответствовать всему тексту, а затем вернется. Вот хорошее объяснение https://javascript.info/regexp-greedy-and-lazy. 9a-z] и нежадный вариант любого символа несколько раз .*?

керри14

10 сентября 2022 г., 17:13

3

Просто пара моментов, чтобы быть уверенным — я не использую javascript, и мне нужен синтаксис для шаблона HTML и PHP preg_match для выполнения той же работы. Вы говорите, что этот синтаксис будет работать для обоих?

рпг_цифровой

4

Я тестировал свои регулярные выражения, используя regex101

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

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

Я бы порекомендовал проверить ссылки, которые я включил в свой пост.

рпг_цифровой

5

керри14:

Сейчас я не разбираюсь в регулярных выражениях, но мне кажется, что на стороне сервера последний раздел регулярного выражения [0-9A-Za-z!@#$%_] (непосредственно перед определением ограничений длины ) должен быть избыточным

Вы правы . любой символ делает свое дело. Однако наборы специальных символов кажутся разными. Версия HTML, кажется, ищет 9&* , а версия PHP — нет. PHP также использует сокращение \d для цифры вместо [0-9]

kerry14

10 сентября 2022 г., 17:32

6

Я очень ценю ваши усилия и время, и я буду изучать ваши идеи дальше, и вы дали мне альтернативу для моей серверной части PHP, спасибо. Но в моем первоначальном вопросе говорилось, что у меня есть два рабочих варианта (1 для PHP и 1 для HTML), но они кажутся разными, хотя оба предназначены для регулярных выражений.

Итак, кто-нибудь, мой HTML в порядке и факт, что синтаксис двух выражений разный?

рпг_цифровой

10 сентября 2022 г. , 17:32

7

@kerry14 См. выше, я ответил на этот вопрос, пока вы печатали.

Изменить: я также дал вам ссылку на regex101, где вы можете, по крайней мере, протестировать свою html-версию, выбрав опцию php, чтобы проверить, работает ли она в PHP 9.0003

керри14

8

рпг_цифровой:

(?=\Д*\д)

Спасибо, только что посмотрел. Так может ли кто-нибудь еще дать мне мнение, хорош ли HTML-код или есть лучший способ? Спасибо

rpg_digital

9

На этом я закончу. 9&*_]).{8,30}$

kerry14

10

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

rpg_digital:

Обратите внимание, что нет никакого варианта HTML-шаблона, так что вам придется исследовать это самостоятельно.

керри14

11

Итак, ребята, возвращаясь к первоначальному вопросу, может ли кто-нибудь предоставить мне PHP preg_match И шаблон HTML 5, соответствующий критериям, которые я впервые перечислил в исходном вопросе — спасибо

rpg_digital