Часть 1

Недавно я работал над своим проектом и некоторое время застревал в логике системы входа в систему. Он работал нормально, но я мог аутентифицироваться только с именем пользователя и паролем. Возможно, вы уже хорошо знаете, что большинство веб-приложений позволяют вам аутентифицироваться с помощью электронной почты и пароля, и это то, что я хотел сделать. Однако выполнять аутентификацию самостоятельно я бы не рекомендовал. Если вы только начинаете заниматься веб-разработкой, просто придерживайтесь системы входа в свою структуру, и все будет в порядке. Но так как мне нужна была какая-то пользовательская функция, я пошел по этому пути и реализовал функцию входа по электронной почте/паролю поверх текущей системы входа. Прежде чем вы даже начнете кодировать такую ​​функцию, вы должны подумать, что нужно для проверки данных пользователя. Вы не можете просто полагаться на то, что пользователи всегда будут вводить чистые имена пользователей, вы должны позаботиться об этом и проверить ввод, прежде чем отправлять его в свою базу данных. Когда вы начинаете думать об электронной почте, что приходит на ум? Электронные письма состоят из нескольких специальных символов, которые указаны в RFC 3696. Помимо электронных писем, RFC содержит другую информацию, не относящуюся к этой статье, поэтому я собираюсь суммировать для вас все символы. Эти символы: @ . _ a-z A-Z 0–9. Еще один момент, который следует отметить, прежде чем мы продолжим, заключается в том, что электронные письма имеют определенную структуру, похожую на [email protected] Несмотря на то, что разрешены @ _ . символов, само электронное письмо не может начинаться или заканчиваться ими. Итак, что я решил сделать, так это проверить электронную почту, предоставленную пользователями, с помощью регулярных выражений, и в этой статье мы рассмотрим, что такое регулярные выражения и как их создавать.

Регулярное выражение или сокращенно регулярное выражение — это последовательность символов, определяющая шаблон поиска. Возможно, вы знакомы с поиском с помощью CTRL+F, который находит любой введенный вами символ, регулярное выражение делает шаг вперед, ища шаблон вместо буквальных строк. Рассмотрим следующий пример. У нас есть файл с кучей имен и номеров, связанных с ними, и мы хотим найти номер телефона. Что мы можем сделать, так это открыть CTRL+F и ввести 555-321-4567. К сожалению, это будет соответствовать только номеру телефона Джона Доу, а мы хотим найти все вхождения по этому шаблону.

John Doe : 551-321-4567
Jane Doe : 552-123-7654

Первое, что нам нужно сделать, это сломать шаблон. Сначала у нас есть три цифры, затем дефис, еще три цифры и дефис и четыре цифры в конце. Если вы просмотрите документацию по регулярным выражениям и выполните поиск в Интернете, вы обнаружите, что сокращение \d обозначает любые цифры из 0-9.. Это означает, что каждое \d будет искать одну цифру. Вернемся к нашему примеру и немного проясним его.

Регулярное выражение \d\d\d даст следующий результат.

551, 321, 456, 552, 123, 765

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

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

Регулярное выражение \d\d\d-\d\d\d выдаст следующий результат.

551-321
552-123

У нас есть значительное улучшение по сравнению с предыдущим регулярным выражением. Последнее, что нужно сделать, это найти последние четыре цифры. Как мы это делаем? Подумайте об этом на секунду — если мы введем \d\d\d, мы получим три цифры, а если мы введем \d\d\d\d, мы получим… четыре цифры. Таким образом, наше регулярное выражение сводится к следующему \d\d\d-\d\d\d-\d\d\d\d, производящему результат, который мы хотели в начале.

551-321-4567
552-123-7654

Несмотря на то, что мы сделали свою работу, я бы сказал, что это довольно неуклюжая работа, но хоть что-то. Как нам улучшить это. Было бы нехорошо, если бы вместо \d\d\d мы могли написать что-то вроде find \d three times? На самом деле можем. В регулярных выражениях есть квантификатор, который записывается следующим образом: {n}, где n — это количество вхождений, которые мы хотим найти. Таким образом, наше регулярное выражение становится \d{3}-\d{3}-\d{4} Я бы сказал, что это значительное улучшение. Что было бы, если бы по какой-то причине пропали дефисы или на их месте появилась точка. Рассмотрим следующее.

551 321 4567
552 123 7654
551.321.4567
552.123.7654

Теперь наш шаблон поиска будет нарушен, потому что мы явно ищем дефис, а символы space или dot никогда не ищутся. Здесь мы ищем то, что будет искать hyphen, space или dot. К счастью, в регулярном выражении есть что-то под названием Character class or Character set, которое соответствует только одному из нескольких символов, заключенных в квадратные скобки [characters_to_search_for]. Поскольку, если мы хотим найти hyphen, dot и space, мы могли бы использовать что-то вроде [\s\-\.] Вам может быть интересно, для чего нужны эти обратные косые черты . Ну, так как это специальные символы, которые имеют значение, мы должны экранировать их, используя обратную косую черту. Просматривая документацию по регулярным выражениям, вы увидите, что \s обозначает пробел, \- экранирует hyphen , а \. экранирует dot Символ точки довольно особенный, и мы собираемся взглянуть на него через некоторое время, но перед этим давайте перестроим наш регулярное выражение и посмотреть, как это выглядит. Итак, чтобы разбить его, наше регулярное выражение становится следующим.

\d{3}[\s\-\.]\d{3}[\s\.-]\d{4}, where
\d{3} - 1st three digits
[\s\-\.] - 1st space or hyphen or dot
\d{3} - 2nd three digits
[\s\-\.] - 2st space or hyphen or dot
\d{4} - last four digits

Ранее я сказал, что dot — это специальный символ, потому что он соответствует каждому символу. Единственным исключением являются символы разрыва строки. Принимая это во внимание, мы могли бы заменить [\s\-\.] на простое [.]. Теперь наше регулярное выражение будет выглядеть так \d{3}.\d{3}.\d{4} и соответствовать каждому телефонному номеру в предоставленном нам списке.

До сих пор мы рассмотрели цифры и некоторые специальные символы. Следующее, что мы собираемся рассмотреть в этой статье, — это буквы и группы. Буквы — это все буквы английского алфавита (нижние и заглавные буквы), которые сокращаются либо до [a-z] (lower chars) and [A-Z] (capital letters), и если вы хотите захватить буквы и цифры одновременно, вы можете использовать символ \w, который равен [a-zA-Z0–9]. Группы или группировка — это метод, с помощью которого мы помещаем часть регулярного выражения в круглые или круглые скобки. Это позволяет нам применить квантификатор ко всей группе или ограничить чередование частью регулярного выражения. Давайте посмотрим это в действии.

У нас те же номера телефонов, что и при построении шаблона поиска, но теперь вместо сокращения \d мы будем использовать \w и dot . Наш шаблон поиска состоит из двух одинаковых частей — это первая и вторая группы из трех цифр и одна группа из четырех цифр. Что мы могли бы сделать, так это следующее — обернуть первую пару из трех цифр в группу и использовать квантификатор 2 и добавить группу из четырех цифр в конце.

(\w{3}.){2}\w{4}, where
(\w{3}.){2} - first and second pair of three digits, each of them followed by dot, space or hyphen (or any character for that matter because of the '.' char
\w{4} - the last four digits

Пример стоит тысячи слов, и это то, что мы собираемся сделать, прежде чем закончить эту статью. У нас есть следующие имена, и мы хотим извлечь только те имена, которые начинаются с «мистер» или «миссис».

John Doe
Jane Doe
Joe Schmoe
Mr. John Doe
Mrs. Joane Doe
Mr. Joe Schmoe

Используя все, что мы узнали до сих пор, мы могли бы написать что-то вроде этого, что дало бы нам все имена, которые начинаются либо с Mr, либо с Mrs.. логический OR.

(Mrs|Mr)\.\s\w{1,}\s\w{1,}

Схема нашего поиска может быть разбита следующим образом. Первая группа возвращает строку Mrs или Mr в зависимости от того, как начинается текущая строка. Затем мы ищем \s or dot, за которым следует \s or space.. После пробела у нас есть два имени, разделенных space., которые можно записать как символ слова \w с квантором {1,}, что означает 1 или более вхождений. Вот табличное представление последнего шаблона поиска.

(Mrs|Mr) - Mrs or Mr
\. - a dot
\s - a space
\w{1,} - a word with 1 or more letters
\s - a space
\w{1,} - a word with 1 or more letters

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

(Mrs?).\s\w+\s\w+

Вывод

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

Удачных поисков!