Регулярни изрази php или. Регулярни изрази (шаблони)

Най-честата употреба на регулярни изрази в Perl е в оператори за търсене и замяна като напр с //, м /, оператори на пакета =~ или != и т.н. По правило всички тези оператори имат подобни опции като:

Тези опции обикновено се наричат ​​"/ x". Те могат да се използват дори вътре в шаблони с помощта на новата конструкция (? ...)

Регулярните изрази или шаблони са същите като процедурите за регулярни изрази в Unix. Изразите и синтаксисът са заимствани от V8 Free Routines на Хенри Спенсър и са описани подробно там.

Шаблоните използват следните метасимволи (знаци, представляващи групи от други знаци), често наричани egrep стандарт:

Метазнаците имат модификатори (написани след метазнака):

Във всички останали случаи брекетисе считат за обикновени (обикновени) знаци. По този начин "*" е еквивалентно на (0,), "+" - (1,) и "?" - (0,1). n и m не могат да бъдат по-големи от 65536.

По подразбиране метазнаците са алчни. Съвпадението се разпространява възможно най-много пъти, като се пренебрегва ефектът от следните метазнаци. Ако искате да "намалите апетита им", използвайте символа "?". Това не променя значението на метазнаците, а само намалява разпространението. Поради това:

Шаблоните работят по същия начин като двойни кавички, така че можете да използвате `\` - знаци (обратна наклонена черта) в тях:

\ T - табулаторен знак
\ н - нова линия
\ r - връщане на карета
\a - форматен превод
\ v - вертикален раздел
\ а - повикване
\ д - бягство
\033 - осмична нотация на символ
\ x1A - шестнадесетичен
\ ° С [ - контролен характер
\ л - малки букви на следващия знак
\ u - Главна буква -//-
\ Л - всички малки букви до \ E
\ У - на върха - // -
\ Е - ограничител за промяна на регистъра
\ Q - отмяна на действие като метазнак

Освен това към Perl са добавени следните метасимволи:

Имайте предвид, че всичко това е "един" знак. Използвайте модификатори, за да посочите последователността. Така:

Освен това има въображаеми метасимволи. Означаване на несъществуващи знаци в точката, където стойността се е променила. Като:

Граница на думата (\ b) е въображаемата точка между символите \ w и \ W. В клас от знаци "\ b" означава символ за връщане назад. Метазнаци \ Аи \ Z- подобно на "^" и "$", но ако началото на реда "^" и краят на реда "$" са валидни за всеки ред в многоредов ред, тогава \ Аи \ Zобозначават началото и края на цял многоредов низ.

Ако групиране ( кръгли скоби), тогава номерът на груповия подниз се обозначава като "\ цифра". Обърнете внимание, че зад шаблон в израз или блок тези групи се наричат ​​"$ цифра". Освен това има допълнителни променливи:

пример:

$ s = "Едно 1 Две 2 и Три 3"; if ($ s = ~ / (\ d +) \ D + (\ d +) /) (отпечатайте "$ 1 \ n"; # Резултат "1" отпечатайте "$ 2 \ n"; # "2" отпечатайте " $ + \ n" ; # "2" отпечатай "$ & \ n"; # "1 две 2" отпечатай "$` \ n "; #" Един "отпечатай" $ "\ n"; # "и три 3" )

Perl версия 5 съдържа допълнителни шаблонни конструкции:

пример:

$ s = "1 + 2-3 * 4"; if ($ s = ~ / (\ d) (? = -) /) # Намерете цифрата, последвана от "-" (отпечатайте "$ 1 \ n"; # Резултат "2") else (отпечатайте "грешка при търсене \ n" ";)

(?! модел) - гледане напред чрез отрицание:

пример:

$ s = "1 + 2-3 * 4"; if ($ s = ~ / (\ d) (?! \ +) /) # Намерете цифра, която не е последвана от "+" (отпечатайте "$ 1 \ n"; # Резултат "2") else (отпечатайте " грешка при търсене \ n ";)

(? ismx) - "вътрешни" модификатори. Удобно е да се използва в шаблони, където например трябва да посочите модификатор вътре в шаблона.

Правила за регулярни изрази. (регламентен израз)

  1. Всеки герой има само себе си, освен ако не е метазнак. Ако трябва да отмените метазнак, го предхождайте с "\".
  2. Низ от символи означава низ от тези знаци.
  3. Наборът от възможни знаци (клас) е квадратни скоби"", това означава, че един от знаците, посочени в скоби, може да бъде на това място. Ако първият знак в скоби е "^" - тогава нито един от посочените знаци не може да се появи на това място в израза. Вътре в клас можете да използвате знака "-", за да посочите диапазон от знаци. Например a-z е една от малките букви на латинската азбука, 0-9 е число и т.н.
  4. Форум за PHP портал. СУ

) Показах ви пример за употреба регулярни изразиза намиране на определени парчета програмен кодстраници. Сега ще се научим как да ги пишем сами. Това умение ще ви помогне да пишете, да изчистите текст от ненужни фрагменти, да търсите необходимите части големи обемитекст и така нататък.

Тази тема е доста трудна, но ще пробвам кратка формаосветяват най-много важни точки... Не знам доколко мога да го направя, но се надявам урокът да е полезен.
И така, като начало има няколко функции за работа с регулярни изрази в PHP, но най-често се използват три:

  • preg_replace - търсене и замяна на текст, съответстващ на регулярния израз;
  • preg_match - просто редовно търсене;
  • preg_split - търсене и разделяне на текст.

от поне, в предишните уроци ги използвахме. По-скоро вместо preg_match имаше preg_match_all, но това по същество е едно и също нещо, само че последното не прекъсва търсенето след първото намиране. Тоест, ако използваме preg_match, тогава няма да намерим всички събития, а само първото.

Изборът в коя ситуация да използвате коя функция е доста прост. Трябва да заменим - използваме replace, както в случая, когато трябва да премахнем ненужните части от кода на страницата, помните ли?

$ page = preg_replace ("/ ^] / i "," ", $ страница); $ page = preg_replace (" / ^] / i "," ", $ страница); $ page = str_replace (""," ", $ страница);

Първият параметър на функцията е регулярен израз, който определя какво търсим. Второто е това, което заменяме. Трето – Където търсим. Следователно, тук взехме променливата $ page и й присвоихме резултата от функцията preg_replace, където търсихме всички полета за отметка тип вход =, както и етикети за отваряне и затваряне. Замени ги с ", тоест просто ги изтриха. Надявам се тук всичко да е ясно. Ще преминем към анализа на самия израз (първия параметър на функцията) малко по-късно.
Имаше и пример за използване на preg_match_all, който беше полезен за намиране на всички връзки в останалата част от текста. Тогава имахме нужда от връзки, защото това беше в тях ключови думикоито анализирахме. Ето какво се случи:

Preg_match_all ("/ ]+?>(.*?)<\/a>/ uis ", $ страница, $ ok); за ($ j = 0; $ j ". $ добре [$ j].""; }

Първият параметър отново е обикновеният, за да намерите всички връзки, които естествено са затворени в тага "a" (ако не сте приятелски настроен с html маркирането, тогава го прочетете). Втората е променлива, която съдържа текста, по който ще се извърши търсенето. Третият параметър е променлива, в която се поставя резултатът - $ ok. След това остава само да преминем през всички необходими $ ok елементи, за да получим нужните ключове. Отделно трябва да се каже, че на изхода получаваме многоизмерен масив. Ето защо го извеждаме по толкова сложен начин: $ ok [$ j]. За да видите структурата на масива, използвайте функцията по-долу и ще разберете всичко.

Print_r ($ добре);

Тук, изглежда, разбрахме функциите, които използвахме за работа. Сега остава само да се научим как да пишем тези много регулярни изрази, които са първият параметър на всеки от тези методи. Да преминем към най-важното.

Как да пиша редовни

Първо, нека да разгледаме основните конструкции. Изразите имат опции. Те се определят с една буква и се изписват в края, предхождани от наклонена черта.

Освен това се поддържат следните метазнаци:

Метасимволите от своя страна могат да имат модификатори:

Е, сега можем да преминем към анализа на нашите редовни от миналия урок. Въз основа на таблетите по-горе, нека се опитаме да разберем какво имаме. Ето израза:

/^] / и

Първата и последната наклонена черта "/" показват, че вътре в тях има регулярен израз. В същото време, след последното, поставяме "i", това е опция, както в първата таблица - без да се отчитат главни и малки букви. Вътре в наклонените черти, самата редовна линия. Започва със знак за по-малко от и маркер за въвеждане и всичко, което следва до знака за точка, който е прост текст за търсене. Но самата точка и символите след нея - това вече е по-интересно. В този случай конструкцията ". *?" означава всяка последователност от знаци. Тоест, ако комбинирате само текста и дадената конструкция, тогава ще изберем целия текст след първото появяване до края. За да спрете, трябва да срещнете или затварящия html таг "по-голям от", или символа за нов ред. Този дизайн просто ни дава тази възможност:

Символите в квадратни скоби са сякаш свързани с логическо ИЛИ. Краят е знак по-голям от ИЛИ началото на ред.
Това е целият израз, в него задаваме начално условие, средно и крайно условие. Не е трудно, нали? Ето илюстрация за яснота:

Нека разбием още един, за да затвърдим всичко. Потърсихме ги за връзки:

/]+?>(.*?)<\/a>/ uis

Четем израза. Отново първо изхвърлете наклонените черти и опциите. Флаговете "uis" са разбираеми, с изключение на "u", което не описах - това показва, че използваме Unicode кодиране. Не остава много. Началото е етикетът "a", който се отваря, след това идва класът

което означава НЕ повече или по-малко (отварящи и затварящи html тагове), тоест всякакви знаци в този случай. „+?“ Добавя се към класа, което означава, че този клас ще присъства 1 или повече пъти (но поне 1 път със сигурност). И тогава идва затварящият html таг за маркера "a". Вътре във връзката има текст, който е зададен от групата

В крайна сметка не знаем какъв вид текст ще има, затова дефинираме такава група. И в края, затварящият маркер "a":

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

Фух. Темата наистина е доста сложна, изисква се практика. Може би правя нещо не съвсем оптимално и можете да създадете други, по-правилни регулярни изрази, но аз съм същият самоук като вас, така че не съдете строго, а по-скоро споделете опциите си в коментарите. Също така, ако нещо не е ясно - коментари и страница за контакт са на ваше разположение.

Регулярните изрази са специални модели за намиране на подниз в текст. С тяхна помощ можете да решите следните задачи в един ред: „проверете дали низът съдържа числа“, „намерете всички имейл адреси в текста“, „заменете няколко последователни въпросителни знака с един“.

Нека започнем с една популярна програмна мъдрост:

Някои хора, когато се сблъскат с проблем, си мислят: „Да, умен съм, ще го реша с регулярни изрази“. Сега те имат два проблема.

Примерни шаблони

Нека започнем с няколко прости примера. Първият израз на снимката по-долу търси последователност от 3 букви, където първата буква е "k", втората е произволна руска буква, а третата е "t" независимо от главните букви (например "cat" или "CAT" съответства на този модел). Вторият израз търси времето в текста във формат 12:34.

Всеки израз започва с разделител. Символът / обикновено се използва като него, но можете да използвате и други символи, които нямат специално предназначение в обикновените модели, например ~, # или @. Използват се алтернативни разделители, ако / може да се появи в израза. След това идва моделът на низа, който търсим, последван от втори разделител, а в края може да има една или повече букви на флага. Те предоставят допълнителни опции при търсене на текст. Ето някои примери за знамена:

  • i - казва, че търсенето трябва да е независимо от главните и главни букви (по подразбиране е чувствително малките букви)
  • u - казва, че изразът и текстът, които се търсят, използват utf-8 кодиране, а не само латински букви. Без него търсенето на руски (и всякакви други не-латински) знаци може да не работи правилно, така че винаги трябва да го използвате.

Самият шаблон се състои от редовни символи и специални конструкции. Е, например, буквата "k" в редовни редове означава себе си, но символите означават "на това място може да има произволно число от 0 до 5". Ето пълен списък със специални символи (те се наричат ​​метасимволи в ръководството за php), а всички други знаци в регулярния израз са нормални:

По-долу ще анализираме значението на всеки от тези символи (и също така ще обясним защо буквата "ё" се изобразява отделно в първия израз), но засега нека се опитаме да приложим нашите регулярни изрази към текста и да видим какво се случва. Php има специална функция preg_match ($ regexp, $ текст, $ съвпадение), която приема редовен шаблон, текст и празен масив като вход. Той проверява дали текстът съдържа подниз, който съответства на дадения шаблон и връща 0, ако не, или 1, ако има такъв. И в предадения масив в елемента с индекс 0 се поставя първото намерено съвпадение с регулярния израз. Нека напишем проста програма, която прилага регулярни изрази към различни низове:

След като се запознаем с примера, ще проучим по-подробно регулярните изрази.

Скоби в регулярни изрази

Нека повторим какво означават различните видове скоби:

  • Къдравите скоби a (1,5) определят броя на повторенията на предишния знак - в този пример изразът търси от 1 до 5 последователни букви "a"
  • Квадратните скоби означават "който и да е от тези знаци", в този случай буквите a, b, c, x, y, z или число от 0 до 5. Други специални знаци като | или * - те представляват обикновен символ. Ако символът ^ е в началото на квадратните скоби, тогава значението е обърнато: "който и да е символ освен посочените" - например [^ a-c] означава "всеки един символ с изключение на a, b или c".
  • Скоби групират знаци и изрази. Например, в израза abc + знакът плюс се отнася само до буквата c и този израз търси думи като abc, abcc, abccc. И ако поставите скобите a (bc) +, тогава кванторът плюс се отнася до последователността bc и изразът търси думите abc, abcbc, abcbcbc

Забележка: в квадратни скоби можете да посочите диапазони от знаци, но не забравяйте, че руската буква ё върви отделно от азбуката и за да напишете „всяка руска буква“, трябва да напишете [a-yayo].

Бекслес

Ако сте разгледали други уроци за регулярни изрази, вероятно сте забелязали, че обратната наклонена черта се пише по различен начин навсякъде. Някъде пишат една обратна наклонена черта: \ d, но тук в примерите се повтаря 2 пъти: \\ d. Защо?

Езикът на регулярните изрази изисква да напишете обратната наклонена черта веднъж. Въпреки това, в низовете с единични и двойни кавички в PHP, обратната наклонена черта също има специално значение: ръководството за низове. Е, например, ако напишете $ x = "\ $"; тогава PHP ще интерпретира това като специална комбинация и ще вмъкне само символа $ в низа (и механизмът за регулярни изрази няма да знае за обратната наклонена черта преди него). За да вмъкнем последователността \ $ в низ, трябва да удвоим обратната наклонена черта и да напишем кода като $ x = "\\ $"; ...

Поради тази причина в някои случаи (когато последователност от знаци има специално значение в PHP) от нас се изисква да удвоим обратната наклонена черта:

  • За да напишем \ $ в регулярния израз, ние пишем в кода "\\ $"
  • За да напишем \\ в регулярния израз, ние удвояваме всяка обратна наклонена черта и пишем "\\\\"
  • За да напишете обратна наклонена черта и число (\ 1) в обикновената мрежа, обратната наклонена черта трябва да се удвои: "\\ 1"

В други случаи една или две обратни наклонени черти ще дадат същия резултат: "\\ d" и "\ d" ще вмъкнат двойка от \ d символи в низа - в първия случай 2 обратна наклонена черта е последователност за вмъкване на обратна наклонена черта, във втория случай няма специална последователност и знаците ще бъдат вмъкнати както са. Можете да проверите какви символи са вмъкнати в низа и какво вижда механизмът за регулярни изрази с echo: echo "\ $"; ... Да, трудно е, но какво можеш да направиш?

Специални конструкции в редовни

  • \ d търси всяка една цифра, \ D - всеки един знак с изключение на цифра
  • \ w съответства на всяка една буква (всяка азбука), цифра или долна черта _. \ W съответства на всеки знак с изключение на буква, цифра, долна черта.

Също така има удобно условие за посочване на граница на думата: \ b. Тази конструкция означава, че от едната му страна трябва да има символ, който е буква / цифра / долно черта (\ w), а от другата не е. Е, например, искаме да намерим думата "котка" в текста. Ако напишем regex / cat / ui, тогава той ще намери последователността на тези букви навсякъде - например вътре в думата "cattle". Това явно не е това, което искахме. Ако добавим граничното условие на думата към регулярния израз: / \ bcat \ b / ui, тогава ще се търси само отделната дума "cat".

Ръководство

  • Синтаксис на регулярен израз на PHP, подробно описание

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

Правила за съставяне на шаблони

Границите на шаблона трябва да бъдат обозначени с определени символи, често използвайте " / "но предпочитам да използвам" # "защото изобилието от наклонени черти напред/обратно може да накара очите ви да изглеждат ужасно, а "решетките" обикновено не се използват никъде другаде. Така че:" #RegularExpressionBody #"

Вътре в регулярния израз се използват скоби - това са подизрази, които могат да бъдат манипулирани, например:

# ^ / каталог / (+) / (+) \. html. * #

Този израз е за получаване на параметри в низ URL адрес... В началото на реда има специален знак " ^ "- това означава началото на ред. Следва" / каталог /"- няма специални символи, това е просто текст, който трябва да се съдържа в низа. След това те срещнаха скоби, тоест стигнаха до първия подизраз. Квадратните скоби означават набора от знаци, които могат да бъдат в низа на това място . Знак" - "означава изброяване. Знак" \ "escapes специални знаци. Така в първия подизраз можем да имаме ГОЛЕМИ и малки букви от латинската азбука, числа от 0 до 9, долно черти, тире и точка. Тире и точка са специални знаци, но тук те са екранирани, така че тук са само символи. След квадратните скоби има " + "- това означава, че предишният знак (и имаме този набор от знаци в квадратни скоби) може да отиде 1 или повече пъти. След това идва" / "е просто символ и подобен втори подизраз. След това идва" \ .html"което означава текст" .html". И след това специални знаци" .* "точка означава всеки знак, а звездичка означава всякакво количество от предишния знак. Тоест след" .html„всичко може да отиде.

Индикация за количество, количествени измерители

По-горе вече разгледахме такива знаци, посочващи броя на предишните знаци, като напр + и * ... Ето всички възможности за уточняване на количеството:

Специални символи

Има специални съкращения за някои групи знаци:

"Алчност"

Нека да разгледаме понятието алчност за регулярни изрази. Например има ред:

#()#

Четем: подизраз:

Ако всичко е правилно, подизразът съвпада:

Но също така пасва:

Ще го получим, защото регулярните изрази са алчни по подразбиране. Можете да премахнете алчността с помощта на модификатора " У", като този:

#() #U

Модификатори

Регулярният израз може да бъде последван от модификатори: " #ThereRegularExpressionBody #ThatModifiers„Видове модификатори:

и Включва режима без значение на главни букви, т.е. главните и малките букви не се различават в израза.
м Указва, че търсеният текст трябва да се третира като няколко реда. По подразбиране механизмът за регулярни изрази третира текста като един низ, независимо какъв е той в действителност. Съответно метазнаците "^" и "$"посочете началото и края на целия текст. Ако този модификатор е посочен, тогава те ще сочат съответно към началото и края на всеки ред текст.
с Метазнакът по подразбиране " . "не включва символ за подаване на ред в своята дефиниция. Посочването на този модификатор премахва това ограничение.
У Премахва алчността на регулярния израз
u Позволява работа с регулярни изрази Кирилица към UTF-8, в противен случай не работи правилно.

php Функции за работа с регулярни изрази

preg_replace

Намерете и заменете:

Preg_replace (смесен модел на $, смесен $ заместване, смесен $ обект [, int $ limit = -1 [, int & $ count]]);

Всяка стойност може да бъде низ или масив, в случай $ предметмасив - връща се масив, в противен случай низ

preg_split

Разделя низ чрез регулярен израз:

Preg_split (низ $модел, низ $предмет [, int $ limit = -1 [, int $ флагове = 0]]);

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


Една от много мощните и полезни функции на езика PHP е неговата поддръжка за регулярни изрази. Много програмисти, както начинаещи, така и доста опитни, са уплашени от външната сложност и объркване на езика на регулярните изрази. Но мога да ви уверя - струва си. Използването на регулярни изрази значително улеснява работата по обработка на текст и лошо структурирани данни.


Регулярните изрази са изрази, написани на специален език.Не се притеснявайте, езикът е достатъчно прост за разбиране, необходими са само опит и практика.


Мисля, че многократно сте попадали в ситуации, когато имате текст (например в Microsoft Word) и трябва да намерите нещо важно в него. Ако знаете какво точно търсите, всичко е просто: извикаха диалоговия прозорец за търсене, въведоха желаната дума, натиснаха бутона и воала - текстът беше намерен.


Но какво правите, ако знаете само предварително какъв тип информация търсите? Например, вашата задача е да намерите всички имейл адреси в няколкостотин листа документ. Някои ще преглеждат документа ръчно, други ще търсят куче (@) и ще го търсят. Съгласете се - и двата варианта са тежък труд, неблагодарен труд.

Тук на помощ идват регулярните изрази. В някакво приближение регулярните изрази могат да бъдат сравнени с маски или шаблони, които се наслагват върху текста: ако текстът съвпада с маската, тогава това е желаният фрагмент. Но преди да разгледаме използването на регулярни изрази, ще разгледаме техния синтаксис.

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

В този случай под символи се разбират всякакви символи от всяка азбука. И не само читави. Можете лесно да вмъкнете нечетлив знак в израз, за ​​това просто трябва да знаете неговия код в шестнадесетична форма. Например:

// четими знаци a Е // нечетими знаци и кодове \ x41 - същото като буквата "A" \ x09 - знак за таблица

Групата знаци е поредица от знаци, написани в последователност:

Abvg ACZms

Обръщам внимание веднага - "интервалът" в регулярните изрази също се счита за значим знак, така че бъдете внимателни, когато пишете изрази. Например, тези знаци grappa са РАЗЛИЧНИ изрази:

ABVGDE ABC КЪДЕ

Следващият езиков елемент са метазнаците. Префиксът "мета" означава, че тези символи описват някои други символи или техните групи. Таблицата показва основните метасимволи на езика на регулярните изрази:

Метасимволи за определяне на специални символи
() Скоби. Дефиниране на вложени изрази.
| Метасимвол за избор
^ Метазнак в началото на реда
$ Метазнак в края на реда
\ н Знак за подаване на ред (шестнадесетичен 0x0A)
\ r Връщане на карета (шестнадесетичен 0x0D)
\ T Табулаторен знак (шестнадесетичен 0x09)
\ xhh Вмъкнете символ с шестнадесетичен код 0xhh, например \ x42 ще вмъкне латинската буква "B"
Метасимволи за определяне на групи от знаци
. Точка. Всеки герой.
\ д Цифра (0-9)
\ Д Не е цифра (който и да е знак, различен от знаци 0-9)
\ с Празен знак (обикновено символ за интервал и табулатор)
\ С Непразен знак (всичко освен знаците, дефинирани от метазнака \ s)
\ w Знак за "речник" (знак, който се използва в думите. Обикновено всички букви, всички цифри и долна черта ("_"))
\ У Всичко освен знаците, посочени от метазнака \ w

Метазнаците от втората половина на таблицата са много лесни за запомняне. "d" е цифра (цифра), "s" е символ (символ), "w" е дума (дума). Ако буквата е голяма, тогава трябва да добавите "НЕ" към описанието на групата.

Например, да вземем текста "Червената фланелка има номера 1812, а зелената фланелка е 2009". Нека разгледаме примери за най-простите регулярни изрази:

\ d \ d \ d \ d - ще намери 1812 и 2009 \ D - ще намери всички букви, интервали и препинателни знаци \ s - ще намери всички интервали в текста.

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

Означава всяка цифра (същото като \ d) - означава четна цифра - обозначава всеки знак от латинската азбука (във всеки случай) или цифра.

Например изразът \ d \ d \ d в тестовия ред ще намери само 1812, но не и 2009. Този израз трябва да се чете като "намерете всички четирицифрени последователности, където последната цифра е 0,2,4,6 или 8".

Трябва само да споменем кванторите и модификаторите.

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

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

Втората форма на нотация е диапазон. Написано като

(X, Y) // или (, Y) // или (X,)

където X е минималният и Y е максималният брой повторения. Например:

се чете като "две до четири последователни цифри". Ако една от границите не е посочена, тогава не се предполага ограничение. Например:

\ w (3,) - три или повече букви. \ d (, 5) - изобщо няма цифри или има цифри, но не повече от пет.

Кванторите могат да се прилагат към единичен знак или към група:

[A-Ya-me] (1,3)

Тази конструкция ще избере от текста всички руски думи от една, две или три букви (например "или", "не", "аз", "отивам" и т.н.)

В допълнение към фигурните скоби с, има още три метасимвола-количество: "*" (звездичка), "+" (плюс) и "?" (въпрос). Използват се в случаите, когато минималният и максималният брой на задължителните повторения не са известни предварително. Например, когато търсите имейл адреси, не можете да кажете предварително колко знака ще има в потребителско име (преди „dog“) и колко в име на домейн (след „dog“).

Метазнакът "*" се чете като "всяко число от нула или повече", т.е. дизайн

дефинира произволен брой последователни букви, включително пълното им отсъствие.

Символът "+" се различава от звездичката само по това, че изисква поне един символ. Тези. дизайн

съответства на всяка числова последователност, където има една или повече цифри.

Символ "?" съответства на отсъствието или наличието на единичен знак. Тези. дизайн

съответства на всяка числова последователност, в която има една или две цифри.

Тук си струва да се спомене такава характеристика на антифизерите "*" и "+" като алчност... Изводът е, че по подразбиране тези знаци съответстват на възможно най-дългата последователност от знаци. Например, за реда „Мама изми рамката“ изразът:

ще избере "mama soap ra", което е малко неочаквано, защото трябваше да получим "ma". За да промените това поведение, използвайте "?" (въпросителен знак), написан непосредствено след квантора. Той задушава апетита на квантификаторите, като ги принуждава да върнат първия мач, а не най-дългия. Сега нека променим предишния пример:

и получаваме необходимото съвпадение "ма".

Последният елемент на езика е модификатори... Модификаторът е специален символ, който определя "системните" параметри на анализа на регулярните изрази. Има само четири такива символа, те могат да се използват както поотделно, така и едновременно:

и Включва режима без значение на главни букви, т.е. главните и малките букви не се различават в израза.
м Указва, че търсеният текст трябва да се третира като няколко реда. По подразбиране механизмът за регулярни изрази третира текста като един низ, независимо какъв е той в действителност. Съответно, метасимволите "^" и "$" показват началото и края на целия текст. Ако този модификатор е посочен, тогава те ще сочат съответно към началото и края на всеки ред текст.
с Метазнакът по подразбиране е "." не включва символ за подаване на ред в дефиницията си. Тези. за многоредов текст, изразът /.+/ ще върне само първия ред, а не целия текст, както се очаква. Посочването на този модификатор премахва това ограничение.
У Прави всички метасимволи неалчни по подразбиране. В някои модификации на езика (по-специално в PHP), вместо "U", се използва символът "g", който е по-подходящ за значението ("g" е съкращение от английски "greedy", "greedy" ).

Таблицата изброява най-популярните и полезни примери за регулярни изрази. Някои от тях може да ви се сторят сложни и тромави, но с подробно проучване несъмнено ще разберете.

Регулярни изрази в PHP.

Има специални функции за работа с регулярни изрази в PHP, чийто списък и кратко описание са дадени в таблицата:

int preg_match (модел на низ, обект на низ [, съвпадения на масив])

Функцията проверява дали съдържанието на темата съответства на модел. Връща 1, ако са намерени съвпадения, в противен случай връща 0. Ако посочите незадължителен параметър на масива, съвпадения, тогава когато функцията се изпълни, към нея ще бъде добавен един елемент - първото намерено съвпадение.

"; print_r (намерено $);?>

int preg_match_all (модел на низ, тема на низ, масив съвпада [, int ред])
Функцията е идентична с предишната, с единствената разлика - тя търси целия текст и връща ВСИЧКИ съвпадения, намерени в масива от съвпадения.
смесен preg_replace (смесен модел, смесен заместител, смесен предмет [, int limit])
Както и двете предишни функции, preg_replace търси част от текст, която съответства на шаблон. Функцията заменя всички намерени фрагменти с текста, посочен в параметрите.Преди почистване:\ n $ текст \ n \ n "; $ текст = preg_replace (" / (\ n \ s (2,)) / "," ", $ текст); ехо" След почистване:\ n $ text "; // ще покаже текст, лишен от специални знаци // и допълнителни интервали?>
смесен preg_replace_callback (смесен модел, смесено обратно извикване, смесен обект [, int limit])
Функцията е разширена версия на предишната. Основната разлика е, че името на функцията, която ще анализира текста и ще формира алтернативния текст, се предава на тази функция в параметрите.
масив preg_split (модел на низ, обект на низ [, int limit [, int флагове]])
Тази функция е подобна на explode () и split (). Неговата особеност е, че разделителят не е фиксиран низ, а регулярен израз. Функцията разделя оригиналните данни на елементи и ги поставя в изходния масив.
масив preg_grep (модел на низ, въвеждане на масив)
Функцията е предназначена за редовно търсене в масиви. За търсенето се посочва шаблон и масив от входни данни и се връща масив, състоящ се само от елементи, които съответстват на шаблона.

Горният списък с функции далеч не е пълен, но е напълно достатъчен за успешен старт на работа с регулярни изрази. Ако се интересувате от тази тема - не пропускайте да прочетете допълнителна литература(например книгата на Фридъл "Регулярни изрази"). Освен това, за целите на обучението, препоръчвам да поставите един от специални програмиза тестване на регулярни изрази (напр. "PCRE" или "RegEx Builder").