регулярные выражения, функция 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
игнорировать пробелы в регулярном выражении
соответствует только началу строки 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
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
6
Я очень ценю ваши усилия и время, и я буду изучать ваши идеи дальше, и вы дали мне альтернативу для моей серверной части PHP, спасибо. Но в моем первоначальном вопросе говорилось, что у меня есть два рабочих варианта (1 для PHP и 1 для HTML), но они кажутся разными, хотя оба предназначены для регулярных выражений.
Итак, кто-нибудь, мой HTML в порядке и факт, что синтаксис двух выражений разный?
рпг_цифровой
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