Статьи

Использование регулярных выражений PHP

  ^ [A-Za-z0-9 -_ +%.] + @ [A-Za-z0-9 -.] +. [A-Za-Z] {2,4} $ 

В этом весь смысл древнеегипетских иероглифов, хотя эти маленькие картинки, по крайней мере, выглядят так, как будто они имеют значение. Но это … это похоже на бред. Что это означает? Это означает oleomarg32@hotmail.com , Fiery.Rebel@veneuser.info , robustlamp+selfmag@gmail.ca ,
или почти любой другой простой адрес электронной почты, потому что это шаблон, написанный на языке, который описывает, как сопоставлять текст в строках. Когда вы хотите выйти за рамки простых текстовых соответствий, например, найти «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, за исключением того, что в этот раз мы не разрешаем подчеркивание, знак плюс или знак процента. Теперь мы готовы к oleomarg23@hotmail.com , Fiery.Rebel@veneuser.info и robustlamp+selfmag@gmail.ca . 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 завершается ошибкой, потому что символ после совпадения не является точкой. drnddog@chewwed.legs.onchair продолжается как drnddog@chewwed.legs. ,

^[A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+.[A-Za-z] {2,4} $
Помните, как мы создали наш собственный шаблон, используя скобки? Мы можем сделать то же самое с фигурными скобками, чтобы сделать пользовательские квантификаторы. {2,4} означает совпадение не менее двух раз, но не более четырех раз. Если бы мы хотели совпадать только два раза, мы бы написали {2} . Мы можем обработать любое количество максимум до четырех с {0,4} . {2,} будет соответствовать минимум двум.

{2,4} – это наш специальный квантификатор, ограничивающий последнее совпадение подстановочными символами любыми 2, 3 или 4 буквами или точками. Мы почти полностью соответствовали oleomarg23@hotmail.com , Fiery.Rebel@venuser.info и robustlamp+selfmag@gmail.ca . drnddog@chewwed.legs.onchair должен пойти назад дальше к drnddog@chewwed.legs, чтобы провести матч.

У нас просто есть еще один, чтобы пойти …

^[A-Za-z0-9-_.+%]+@[A-Za-z0-9-.]+.[A-Za-z]{2,4} $
$ является противоположностью ^ . Как и ^ для начала строки, $ привязывает совпадение к концу строки. Все наши примеры теперь совпадают, и drnddog@chewwed.legs.onchair терпит неудачу, потому что нет 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 будет совпадать как единое целое. Но, сделав его не жадным, мы говорим ему найти самый короткий подходящий шаблон … просто tweedle@dee.com .

Вы заметили, что мы также заключили все выражение в скобки? Это заставляет механизм регулярных выражений захватывать копию текста, которая соответствует выражению в скобках, на которое мы можем ссылаться с помощью обратной ссылки ( 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