^ [A-Za-z0-9 -_ +%.] + @ [A-Za-z0-9 -.] +. [A-Za-Z] {2,4} $
В этом весь смысл древнеегипетских иероглифов, хотя эти маленькие картинки, по крайней мере, выглядят так, как будто они имеют значение. Но это … это похоже на бред. Что это означает? Это означает [email protected] , [email protected] , [email protected] ,
или почти любой другой простой адрес электронной почты, потому что это шаблон, написанный на языке, который описывает, как сопоставлять текст в строках. Когда вы хотите выйти за рамки простых текстовых соответствий, например, найти «Stud» в «Mustard» (что, кстати, не получится), и вам нужен способ «объяснить», что вы ищете, потому что каждый экземпляр может отличаться, Вы стали нуждаться в регулярных выражениях, ласково называемых регулярными выражениями.
Введение в регулярные выражения
Чтобы намочить ноги, давайте возьмем приведенный выше пример и разберем его по частям.
^ [A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+.[A-Za-z]{2,4}$
Начало строки может быть обнаружено аналогично возврату каретки, хотя на самом деле это не невидимый символ. Использование ^
говорит механизму регулярных выражений, что совпадение должно начинаться в начале строки.
^ [A-Za-z 0-9-_.+% ] +@[A-Za-z0-9-.]+.[A-Za-z]{2,4}$
Вместо того, чтобы указывать каждый символ алфавита, у нас есть сокращение, которое дает диапазон. Обычно он чувствителен к регистру, поэтому вам придется указывать как верхний, так и нижний регистр.
^ [ A-Za-z 0-9 -_.+% ] +@[A-Za-z0-9-.]+.[A-Za-z]{2,4}$
То же самое касается чисел; мы можем просто сократить их до диапазона вместо записи всех 10 цифр.
^ [ A-Za-z0-9 -_.+%] +@[A-Za-z0-9-.]+.[A-Za-z]{2,4}$
Это специальные символы, которые мы разрешаем: тире, подчеркивание, точка, знак плюс и знак процента.
^ [ A-Za-z0-9-_.+% ] +@[A-Za-z0-9-.]+.[A-Za-z]{2,4}$
Квадратные скобки, окружающие наши диапазоны, эффективно используют все, что вы положили между ними, для создания своего собственного группового символа. Наш «подстановочный знак» может соответствовать любой букве AZ в верхнем или нижнем регистре, цифре 0-9 или одному из наших специальных символов пунктуации.
^[A-Za-z0-9-_.+%] + @[A-Za-z0-9-.]+.[A-Za-z]{2,4}$
Это квантификатор; он изменяет, сколько раз предыдущий символ должен совпадать, в этом случае предыдущий символ является набором в скобках. +
означает «хотя бы один», поэтому в нашем примере после сопоставления начала строки у нас должен быть хотя бы один из символов в скобках.
На данный момент мы можем сопоставить (учитывая примеры адресов электронной почты ранее) oleomarg23 , Fiery.Rebel и robustlamp + selfmag . Что-то вроде @ SodaCanDrive.com не получится, потому что у нас должен быть хотя бы один из символов в наборе в квадратных скобках в самом начале текста.
В дополнение к +
в качестве квантификатора есть *
который почти идентичен, за исключением того, что он будет совпадать, если вообще не будет совпадений. Если мы заменили первый +
квантификатор в образце на *
и имели это:
^ [A-Za-z0-9 -_. +%] * @ [A-Za-z0-9 -.] +. [A-Za-z] {2,4}
он бы успешно совпал со строкой @ SodaCanDrive.com, так как мы фактически приказываем механизму регулярных выражений продолжать сопоставление до тех пор, пока не встретится символ, которого нет в наборе, даже если его нет
Вернуться к нашей оригинальной модели …
^[A-Za-z0-9-_.+%]+ @ [A-Za-z0-9-.]+.[A-Za-z]{2,4}$
Буква @
соответствует буквально, поэтому теперь мы сопоставили oleomarg23 @ , Fiery.Rebel @ и robustlamp + selfmag @ . Текст greencandelabra.com терпит неудачу, потому что у него нет знака!
^[A-Za-z0-9-_.+%]+@ [A-Za-z0-9-.]+ .[A-Za-z]{2,4}$
Эта часть выражения аналогична той, которую мы сопоставляли перед знаком at, за исключением того, что в этот раз мы не разрешаем подчеркивание, знак плюс или знак процента. Теперь мы готовы к [email protected] , [email protected] и [email protected] . gnargly3.1415@pie_a_la_mode.com будет соответствовать только gnarly3.1415@pie .
^[A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+ . [A-Za-z]{2,4}$
Здесь у нас есть экранированная точка, чтобы буквально соответствовать ей. Обратите внимание, что знак «плюс» встречается буквально, когда он заключен в квадратные скобки, но снаружи он имеет особое значение как квантификатор. За пределами скобок точка должна быть экранирована, иначе она будет рассматриваться как символ подстановки; внутри скобок точка означает точку.
Ой! Поскольку мы уже сопоставили .com , .info и .ca , может показаться, что совпадение не получится, потому что у нас больше нет точек. Но регулярное выражение разумно: соответствующий механизм пытается вернуться, чтобы найти соответствие. Итак, теперь мы вернулись к oleomarg23 @ hotmail. , Fiery.Rebel@veneuser. и robustlamp + selfmag @ gmail. ,
На этом этапе gnargly3.1415@pie_a_la_mode.com завершается ошибкой, потому что символ после совпадения не является точкой. [email protected] продолжается как [email protected]. ,
^[A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+.[A-Za-z] {2,4} $
Помните, как мы создали наш собственный шаблон, используя скобки? Мы можем сделать то же самое с фигурными скобками, чтобы сделать пользовательские квантификаторы. {2,4}
означает совпадение не менее двух раз, но не более четырех раз. Если бы мы хотели совпадать только два раза, мы бы написали {2}
. Мы можем обработать любое количество максимум до четырех с {0,4}
. {2,}
будет соответствовать минимум двум.
{2,4}
— это наш специальный квантификатор, ограничивающий последнее совпадение подстановочными символами любыми 2, 3 или 4 буквами или точками. Мы почти полностью соответствовали [email protected] , [email protected] и [email protected] . [email protected] должен пойти назад дальше к [email protected], чтобы провести матч.
У нас просто есть еще один, чтобы пойти …
^[A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+.[A-Za-z]{2,4} $
$
является противоположностью ^
. Как и ^
для начала строки, $
привязывает совпадение к концу строки. Все наши примеры теперь совпадают, и [email protected] терпит неудачу, потому что нет 2, 3 или 4 букв, которым предшествует точка в конце строки.
Регулярные выражения в PHP
Хорошо понимать базовую нотацию, используемую регулярными выражениями, но нам все еще нужно знать, как применять ее в контексте PHP, чтобы на самом деле сделать что-то продуктивное, поэтому давайте посмотрим на функцию preg_match()
, preg_replace()
и preg_match_all()
.
preg_match ()
Чтобы проверить поле формы для адреса электронной почты, мы использовали бы preg_match()
:
<?php if (preg_match('/^[A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+.[A-Za-z]{2,4}$/', $_POST["emailAddy"])) { echo "Email address accepted"; } else { echo "Email address is all broke."; }
Если совпадение найдено, preg_match()
возвращает 1, иначе 0. Обратите внимание, что мы добавили косую черту в начало и конец регулярного выражения. Они используются в качестве разделителей, чтобы показать функцию, где регулярное выражение начинается и заканчивается. Вы можете спросить: «Но, Джейсон, разве не для этого нужны цитаты?» Позвольте мне заверить вас, что в этом есть что-то еще, как я вскоре объясню.
preg_replace ()
Чтобы найти адрес электронной почты и добавить форматирование, мы будем использовать preg_replace()
:
<?php $formattedBlock = preg_replace( '/([A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+.[A-Za-z]{2,4})/U', "<b>\1</b>", $blockOText);
Вот то обещание, которое было обещано: мы поместили U
после конечного разделителя в качестве флага, который изменяет соответствие регулярного выражения. Мы видели, как совпадения с регулярными выражениями являются жадными: они сжигают столько символов, сколько могут, и только возвращают назад, если это необходимо. U делает регулярное выражение «не жадным». Без него строка tweedle @ dee.com-and-tweedle @ dum.com будет совпадать как единое целое. Но, сделав его не жадным, мы говорим ему найти самый короткий подходящий шаблон … просто [email protected] .
Вы заметили, что мы также заключили все выражение в скобки? Это заставляет механизм регулярных выражений захватывать копию текста, которая соответствует выражению в скобках, на которое мы можем ссылаться с помощью обратной ссылки ( 1
). Второй аргумент preg_replace()
говорит функции заменять текст открывающим полужирным тегом, независимо от того, соответствует ли шаблон между первым набором скобок и закрывающим полужирным тегом. Если бы были другие наборы скобок, на них можно ссылаться с помощью 2
, 3
и т. Д. В зависимости от их положения.
preg_match_all ()
Для сканирования некоторого текста и извлечения массива всех найденных в нем адресов электронной почты preg_match_all()
— наш лучший выбор:
<?php $matchesFound = preg_match_all( '/([a-z0-9-_.+%]+@[a-z0-9-.]+.[az]{2,4})/Ui', $articleWithEmailAddys, $listOfEmails); if ($matchesFound) { foreach ($listOfEmails[0] as $foundEmail) { echo $foundEmail . "<br>"; } }
preg_match_all()
возвращает количество найденных совпадений и вставляет эти совпадения в ссылку на переменную, которую мы указали в качестве третьего аргумента. Фактически он создает многомерный массив, в котором искомые совпадения находятся по индексу 0.
В дополнение к модификатору U
мы предоставили i
который указывает механизму регулярных выражений, что мы хотим, чтобы шаблон применялся без учета регистра. То есть /a/i
будет соответствовать как строчной букве A, так и прописной букве A (или /A/i
будет одинаково хорошо работать в этом отношении, так как модификатор требует, чтобы механизм не зависел от регистра). Это позволяет нам теперь [a-z0-9]
в нашем выражении такие вещи, как [a-z0-9]
вместо [A-Za-z0-9]
что делает его немного короче и легче прогуливаться.
Хорошо, что обернуть вещи. Несмотря на то, что вы можете сделать гораздо больше, используя регулярные выражения, включающие упреждающие, упреждающие и более сложные примеры обратных ссылок, все из которых вы можете найти в онлайн-документации PHP, надеюсь, у вас будет много работы с этим. служить вам для многих сценариев только из этой статьи.
Изображение через Бориса Мрдя / Shutterstock