Регулярни изрази

Най-накрая стигнах до тази статия, в която ще се опитам да говоря за регулярните изрази в PHP от нулата. Като за начало, какво е това?

Накратко и на разбираем език, тогава регулярните изрази са метод, базиран на съвпадение на низ с даден шаблон.

Основи на основите

Както казах, ще започна от нулата. Нищо чудно, че маркирах тази статия с етикета „Начинаещ“.

И всичко започва с низ в PHP.

Ако първо трябва даопределим дали abc е в нашия низ, и едва след това да го отпечатаме, тогава ще се опитаме да направим нещо подобно:

Кодът по-горе е само пример, тъй като това не е най-добрият начин за намиране на срещане в низ, по-добре е да използвате PHP функциите strpos() или strstr().

Малко отклонение за българските букви

Искам да обърна внимание на факта, че регулярните изрази на PHP не поддържат български букви по подразбиране и следователно не всички примери ще работят правилно, но това може лесно да се коригира с модификатора /u (ще обясня всичко по-късно), който включва допълнителна функционалност: шаблонът и низовете ще бъдат обработени като UTF-8 (достъпно от PHP 4.1.0).

Повече подробности в следния пример.

Главни букви

Главните и малките букви не са еднакви. Чувствителността към малки и главни букви обаче може да бъде изключена с модификатора /i. Модификаторите се добавят в края на модела, вижте примера:

И сега това, което споменах по-горе - същият този пример няма да работи коректно с български букви. За да поправим това, ще добавим и модификатора /u.

Търсете съвпадение в началото на низа, символ ^

Да се ​​посочи в шаблона началотолиния, се използва символът карета ^.

По-лесно от просто, нали?

Намиране на съвпадение за края на низ. Каква е разликата между \z и $

Тук е по-интересно. Да започнем с това, че има два "края на реда", единият е краят на низовата променлива като цяло, а другият е краят на реда в текста \n , тоест текстът продължава по-нататък, просто от нов ред.

Така че, ако искате точнопоследните символи в низова променлива, винаги използвайте \z.

Много често $ се използва за тази цел и много публикации в различни сайтове също препоръчват това, но никога не споменават как всъщност работи.

Като цяло можем да заменим \z с $ в предишния пример и той ще провери дали последните символи в променливата съвпадат, но ако активирате поддръжка за многоредово търсене с модификатора /m, тогава символите \n в самия ред вече ще се възприемат като нов ред в текста (за скучните, натискане на клавиша Enter) и тогава условието ще стане вярно за буквите pr.

Специални знаци (метазнаци)

Вече разгледахме няколко прости примера и в процеса се запознахме с метасимволите $ и ^. Както вече разбрахте, те имат специално значение в шаблона, например ^ означава началото на ред, а знакът за долар $ означава края на ред (макар и с някои уговорки).

А ето и останалите метасимволи. , * , ? , < , >, [ , ] , + , \ , , ( , ) . Ще ги разгледаме в хода на този урок, но засега е важно да разберете какво представляват.

Въпросът е, че те не стоят сами за себе си и следователно, за да търсим низ, започващ например с 2+2, трябва да избегнем +.

Както можете да видите в този случай, функцията на метасимвола + беше игнорирана и той беше възприет като нормален знакплюс на линия.

Квадратни скоби [ ]

И така, квадратните скоби ви позволяват да посочите набор от знаци в шаблона, който може просто да бъде изброен [abcgd] или зададен в интервала [a-d].

Моля, имайте предвид, че такива интервали на знаци означават само 1 знак, принадлежащ на този интервал.

Този пример ще върне 1 както за "mage", така и за например "flash".

Други метасимволи, изброени в квадратни скоби, не работят, така че не е необходимо да бъдат екранирани, например в този модел [abc50$] доларът ще означава сам себе си.

Но има изключения, къде без тях - ако зададете символа за каретка ^ първо вътре в квадратните скоби, тогава това няма да означава началото на реда, а несъответствие с набора от знаци, например [^b] - ще означава всеки знак с изключение на "b", [^a-u] - всеки знак, който не е в интервала "a-u". Оттук и примерът:

За да покажем всички знаци, които ни подхождат, ние просто заместваме функцията preg_match() с preg_match_all().

Къдрави скоби

Къдравите скоби ви позволяват да посочите колко пъти знакът (или набор от знаци), предхождащ ги, трябва да се появи в низ.

Точка обозначава всеки отделен знак, с изключение на нови редове \n или \r.

Звездичката означава произволен брой знаци пред нея (включително 0). Нека обясня с пример.

Плюсът е почти същият като звездичката с едно единствено изключение - не отчита липсата на знак, тоест, ако вземете предишния пример и низа pp, тогава ще се покаже 0.

Въпросителен знак ?

Скоби ( ) и лента напред

Този набор от символи ви позволява да зададете няколко логически ИЛИ условия.

Ако променим малко този пример, тогава функцията може да ни покаже кое от условиятаприближен.

Миша Рудрастих

За първи път се запознах с WordPress през 2009 г. От 2014 г. можете да ме срещнете в WordCamp - официалната конференция на WordPress, понякога говоря там. В момента също преподавам курсове по WordPress в Epic Skills.

Ако имате нужда от помощ за вашия сайт или може би дори от разработка от нулата, пишете ми.