У дома / Общ преглед на Windows / Php редовен от номер на низ. PHP regexp: примери за регулярни изрази. Примери за регулярен израз

Php редовен от номер на низ. PHP regexp: примери за регулярни изрази. Примери за регулярен израз

Нека започнем с това какво е регулярен израз. Така че отговорете ми на този въпрос: има ли "е" в думата "тест"? "Яжте!" ти каза. Тогава ти задавам втори въпрос, как намери буквата "е" в думата "тест"? Отговорът е очевиден, вземаме първия знак, тоест „t“ и го сравняваме с това, което търсим, тоест с „e“. Ако не са равни, тогава вземаме втория знак, тоест „e“, и го сравняваме с това, което търсим, тоест „e“. Ето! Беше намерено съвпадение. Отговор: Думата "тест" съдържа буквата "е".

Сега ми отговорете на още един въпрос, къде е регулярният израз в този пример? Надявам се, че се досещате, че регулярният израз тук е това, което търсим в думата "тест". Тоест буквата "e" в този пример е регулярен израз.

За какво се използват регулярните изрази в PHP? В моята практика се използват регулярни изрази, например, за да се определи дали даден адрес е съставен правилно електронна поща. Такива изрази се използват и за определяне на правилността на потребителското име и паролата. Използвайки регулярни изрази, можете да намерите адреса във връзка и да го запазите. Има много неща, които можете да направите, като анализирате това, можете да идентифицирате основната функция на регулярните изрази и две странични. Главна функция , това е търсене на съвпадения в низ. Страничните ефекти включват запазване на намерените съвпадения и замяната им.

Първи регулярен израз

На теория разбираме как да намерим знака "e" в думата "test", но как се прилага това на практика? За да използвате регулярни изрази в php, обикновено се използват следните функции:

preg_match("регулярен израз (образец)", "променлива, в която се извършва търсенето", "Променлива, в която се записва резултатът от търсенето (незадължителен параметър)"); - Функция за съвпадение
preg_replace("регулярен израз (модел)", "С какво да се замени намереното съвпадение", "променлива, в която се извършва замяната"); - Функция за замяна

Нека започнем да използваме тези функции. Ето пример за търсене на знака "e" в думата "test":

$a = "тест";
if(preg_match("/e/",$a)) echo "намерено!!";

Кодът описва условието: ако в променливата $a бъде намерено нещо, съответстващо на шаблона, тогава се показва съобщението „намерено!!” Както може би сте забелязали, нашият шаблон се намира между две "/". IN в такъв случайсимвол "/" символизира началото и края на нашия модел. Надявам се това да е ясно.

Всичко това е интересно, разбира се... но нашият шаблон е много прост, не мислите ли? В края на краищата рядко се налага да намираме някакъв символ в променлива. В повечето случаи трябва да намерим много герои, а също и непознати. Как да бъдем? Нека си поставим проблем и се опитаме да го разрешим. Да предположим, че имаме низ, състоящ се от числа и една неизвестна английска буква

Как да намеря това писмо? Може да има всяка буква от английската азбука, така че как можете да я идентифицирате? Вие сами отговорихте на въпроса си, има всяка буква, тоест тя е в диапазона от a до z. Можете да използвате диапазони в регулярни изрази. Ако не знаем какъв знак търсим, но знаем със сигурност, че този знак е буква от английската азбука, тогава записът ще бъде както следва:

$a = "123a321";
if(preg_match("//",$a)) echo "намерено!!";

Имайте предвид, че диапазонът е ограден в скоби "[" "]". Всичко оградено в такива скоби се определя като единсимвол, в този случай символът варира от a до z. Ако трябва да намерим не буква, а число, тогава записът ще бъде така:

$a = "abc1cba";
if(preg_match("//",$a)) echo "намерено!!";

Искам също да отбележа, че регулярните изрази са чувствителни към главни и малки букви, така че символите „A“ и „a“ са напълно различни, за да търсите и двата знака, напишете така:

$a = "123a321";
if(preg_match("//",$a)) echo "намерено!!";

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

$a = "123×321";
if(preg_match("/[a-zA-Z]/",$a)) echo "намерено!!";

Метазнаци

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

ред - 123а321
проба -

Хм... шаблонът всъщност съвпада с нашия низ и при проверка за съответствие ще даде дългоочакваното вярно! Но това е малко тромав запис, не мислите ли?

Ето как да го съкратите:

ред - 123а321
проба - *

Струва ми се, че е по-кратък. Какъв е символът „*“? Това е същият метасимвол, което означава, че символът, който описахме (а именно символ, който може да съдържа числа от 0 до 9 или букви от английската азбука, от a до z), може да се повтаря безкрайно или повече от веднъж. Да да! Този метасимвол ще намери съвпадение в празна променлива, тъй като дори липсата на символа, който описахме, ще върне true! Запомни това

Какви други метасимволи има?

Например метасимволът "+" е почти подобен на метасимвола "*" с едно малко изключение. „*“ ще върне истина, дори ако няма знак, а „+“ ще провери наличието на поне един знак. Това е, ако една линия изисква присъствие минимумедин знак, след това използвайте "+" вместо "*"

Метазнакът "?" също често се използва. Това означава, че редът трябва да съдържа не повече от един желан знак. Позволете ми да дам няколко примера за последните два метасимвола, които описах.

Да предположим, че трябва да проверим правилността на паролата на потребителя. Нека помислим какво трябва да съдържа потребителската парола? Е, първо, трябва да е поне един знак. Второ, трябва да съдържа само цифри и букви от английската азбука, така че регулярният израз ще изглежда така:

$a = "qwerty12345";

Какви знаци допуснахме? Английски букви във всякакъв регистър и цифри. Сега опитайте да оставите празен ред вместо паролата.

$a = "";
if(preg_match("/+/",$a)) echo "Паролата е правилна";

Няма да видите съобщението „Паролата е правилна“. Защо? Тъй като метасимволът "+" проверява низа, за да види дали има поне един знак.

А сега малък трик, нека да погледнем изражението си, ние не позволихме, добре, да кажем интервал в него, нали? поставете интервал в края на паролата и стартирайте

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "Паролата е правилна";

И защо виждаме нашето съобщение за правилната парола? Много е просто... Функция preg_match(); спира проверката си при първото съвпадение. Тоест, символът “q” отговаря на модела, който описахме, и всичко останало вече не е важно за функцията. Какво трябва да направим? Ето как да го поправите:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "Паролата е правилна";

Чрез добавяне на "^" в началото на израз и "$" в края, казваме на функцията на какво трябва да съответства моделът всичколиния. Ако стартирате този код, няма да видите съобщението, тъй като в края на паролата има незаконен знак - интервал

Сега сменете метасимвола "+" на метасимвола "?". Какво мислите, че ще се случи? Правилно, няма да има съобщение за правилността на паролата, тъй като паролата съдържа повече от един знак. Надявам се, че правилно обясних работата на тези три често използвани метазнака

Понякога "не" е по-добре

Поне се научихме как да проверяваме дали паролата е правилна и това е добре! Нека ви разкажа за друг начин за търсене на нещо в низ. Да кажем, че трябва да проверим за липса на числа в низ. Как да го направим? Ето реда:

(Специално въведох тези символи „-_+()“ в него, за да не изглежда животът като мед...) Можем да формулираме следния израз:

Но трябва да признаете, че не винаги знаем какви знаци се използват в един ред, но знаем със сигурност, че в него не трябва да има числа! Следователно би било по-логично просто да напишете шаблон, който да пропуска редове, в които Нечисла, а не тези, в които има „О, Боже, има толкова много неразбираеми символи!!!“. Ето пример за правилно съставен израз за такива проблеми:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "Няма числа!";

Как постигнахме това? Въведохме символа Но!капачката "^" ([^0-9]), поставена в началото, показва, че ще има не трябваНадявам се, че това е решено

Е, нека приключим бавно... Ще дам два примера с обяснения, по време на които ще научим как да запазим резултата от търсенето в променлива и как да проверим пощенския адрес за коректност

Видях го и го запазих!

Моят блог

$a = " Моят блог";
preg_match("/ /", $a);

В нашия регулярен израз описахме всички възможни символи, които могат да бъдат включени в една връзка. Искам също да обърна внимание на символите в кавичките и “/” в нашия израз. Те са предшествани от обратна наклонена черта, за какво е това? Факт е, че "/" и кавичките сами по себе си са специални знаци. И за да може шаблонът да ги възприема като обикновени символи, трябва да ги екранираме. Изходът се извършва чрез добавяне на обратна наклонена черта преди специални знаци. Надявам се да е ясно

$a = " Моят блог";
preg_match("/ /", $a, $b);

Е, съответно е необходимо да добавите допълнителен параметър под формата на променлива $b, в която ще се съхранява намерената връзка. Също така трябва да знаете, че резултатът от търсенето се поставя в масив. Следователно променливата $b е масив. Информацията, която търсим, е под индекс 1. Това означава, че резултатът от търсенето е в променливата $b. Нека изведем резултата на екрана:

$a = " Моят блог";
preg_match("/ /", $a, $b);
ехо $b;

Правилният адрес е ключът към успеха!

И накрая отговорът на въпроса правилен ли е имейлът? Първо, трябва да разберете какви символи са разрешени в адресите? Доколкото знам, разрешените знаци включват:

  • Английски букви, цифри, “_”, “-” хмммм всичко изглежда... Ще продължим от това.
  • След това имаме "@"
  • След, английски букви
  • Следваща точка
  • И отново английски букви...

Така че регулярният израз ще бъде както следва:

$a = " [имейл защитен]";
if(preg_match("/^+@+.+$/", $a)) echo "имейл адресът е правилен!";
else echo "e-mail адресът НЕ е написан правилно!";

Е... Надявам се, че подобни записи не ви плашат сега и можете да ги разберете.

Накрая искам да кажа нещо. Статията се оказа тромава и в същото време покриваше само част от възможностите. Ако четете това изречение, значи най-вероятно сте го прочели до края, за което ви благодаря

Относно поредицата от статии за разработване на cms блог, първата част от поредицата Обявявам го за закрито!В близко бъдеще ще започнем да внедряваме административния панел, така че не „превключвайте“ Ако имате въпроси, ще се радвам да отговоря. Всичко най-добро за теб, това е всичко, което имам!

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

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

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

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

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

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

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

Preg_match_all("/ ]+?>(.*?)<\/a>/uis",$page,$ok); за ($j=0; $j ".$ok[$j].""; }

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

Print_r($ok);

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

Как се пишат правилни изречения

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

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

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

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

/^]/i

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

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

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

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

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

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

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

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

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

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

Бързото развитие на Интернет и езиците за WEB разработка изисква създаването на универсални и компактни инструменти за обработка на текстова информация с минимално количество код, необходим за това. Езикът PHP, популярен сред начинаещи и професионални разработчици, не прави изключение. Регулярният израз като език за текстови шаблони ви позволява да опростите задачите за обработка на текст и да намалите програмния код с десетки и стотици редове. Много проблеми не могат да бъдат решени без него.

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

Езикът PHP съдържа три механизма за работа с регулярни изрази - “ereg”, “mb_ereg” и “preg”. Най-често срещаният е интерфейсът "preg", чиито функции осигуряват достъп до библиотеката с регулярни изрази PCRE, първоначално разработена за езика Perl, която е включена в PHP. Функциите Preg търсят даден текстов низ за съвпадения според конкретен модел в езика на регулярните изрази.

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

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

B е формално дефиниран по много сложен начин, така че нека опростим описанието. Регулярният израз е текстов низ. Състои се от разграничен шаблон и модификатор, указващ как да се обработва. В шаблоните е възможно да се включат различни алтернативи и повторения.

Например в израза /\d(3)-\d(2)-\d(2)/mразделителят ще бъде «/» , след това идва шаблонът и символът "м"ще бъде модификатор.

Цялата мощ на регулярните изрази е кодирана с помощта на метазнаци. Основният метазнак на езика е обратната наклонена черта - “\”. Той обръща типа на знака, който го следва (т.е. обикновен символ става метасимвол и обратно). Друг важен метасимвол е наклонената черта "|", която указва алтернативни варианти на модела. Още примери за метазнаци:

PHP, когато обработва регулярни изрази, третира интервала като отделен значим знак, така че изразите ABCWHERE и ABCWHERE са различни.

Подмодели

В PHP обикновените подмодели са разделени със скоби и понякога се наричат ​​„подизрази“. Изпълнете следните функции:

    Маркиране на алтернативи. Например шаблон топлина (нещо|птица|)съвпада с думите "топлина", "жар птица"И "печено". И без скобите би било просто празен низ, „bird“ и „roast“.

    „Вълнуващ“ подмодел.Това означава, че ако даден подниз съвпада в шаблона, всички съвпадения се връщат като резултат. За яснота нека дадем пример. Даден е следният регулярен израз: победителят получава ((златен|позлатен)(медал|купа)) -и ред за намиране на съвпадения: "победителят получава златен медал". В допълнение към оригиналната фраза, резултатът от търсенето ще върне: "златен медал", "медал", "злато".

Оператори за повторение (квадрификатори)

Когато пишете регулярни изрази, често е необходимо да анализирате повторенията на числа и символи. Това не е проблем, ако няма много повторения. Но какво да правим, когато не знаем точния им брой? В този случай трябва да използвате специални метазнаци.

За описание на повторенията се използват квадрификатори - метасимволи за уточняване на количеството. Квадрификаторите са два вида:

  • общи, оградени в скоби;
  • съкратено.

Общият квантификатор определя минималния и максималния брой разрешени повторения на елемент, изразен като две числа във фигурни скоби, по следния начин: x(2,5). Ако максималният брой повторения е неизвестен, вторият аргумент се пропуска: x(2,).

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

1. * - нула или повече повторения, което е еквивалентно на (0,).

2. + - едно или повече повторения, т.е. ,).

3. ? - нула или само едно повторение - (0,1).

Примери за регулярен израз

За тези, които учат регулярни изрази, примерите са най-добрият урок. Ще ви представим няколко, които показват широките си възможности с минимум усилия. Всички програмни кодове са напълно съвместими с PHP версии 4.x и по-нови. За да разберете напълно синтаксиса и да използвате всички функции на езика, препоръчваме книгата на J. Friedl „Регуларни изрази“, която подробно обсъжда синтаксиса и съдържа примери за регулярни изрази не само в PHP, но и за Python, Perl, MySQL, Java, Ruby и C#.

Проверка на коректността на имейл адреса

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

Решение.Както при всеки език за програмиране, PHP регулярните изрази за проверка на имейл адрес могат да бъдат внедрени по различни начини и примерите в тази статия не са всичко и всичко. Затова във всеки случай ще предоставим списък с изисквания, които трябва да се вземат предвид при програмирането, а конкретната реализация зависи изцяло от разработчика.

Така че израз, който проверява дали имейлът е валиден, трябва да провери следните условия:

  1. Наличието на символа @ в изходния низ и липсата на интервали.
  2. Домейн частта от адреса, последвана от символа @, съдържа само валидни знаци за имена на домейни. Същото важи и за потребителското име.
  3. Когато проверявате потребителско име, трябва да потърсите специални знаци като апостроф или Тези знаци са потенциално опасни и могат да бъдат открити при атаки като SQL инжектиране. Избягвайте подобни адреси.
  4. Потребителските имена позволяват само една точка, която не може да бъде първият или последният знак на реда.
  5. Името на домейна трябва да съдържа поне два и не повече от шест знака.

Пример, който взема предвид всички тези условия, може да се види по-долу на фигурата.

Проверка на валидността на URL адресите

Задача.Проверка дали даден текстов низ е валиден Още веднъж регулярните изрази за проверка на URL могат да бъдат приложени по различни начини.

Решение.Нашата окончателна версия изглежда така:

/^(https?:\/\/)?([\da-z\.-]+)\.((2,6))([\/\w \.-]*)*\/?$ /

Сега нека разгледаме неговите компоненти по-подробно, като използваме фигурата.

Проверка на номера на кредитни карти

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

Решение.Когато създавате израз, трябва да вземете предвид възможното наличие на интервали във въведеното число. Цифрите на картата са разделени на групи, за да улеснят четенето и диктовката. Следователно е съвсем естествено човек да се опита да въведе номера по този начин (т.е. чрез интервали).

Написването на универсален израз, който взема предвид възможните интервали и тирета, е по-трудно от простото изхвърляне на всички знаци с изключение на цифрите. Затова се препоръчва да се използва метасимволът /D в израза, който премахва всички знаци с изключение на числата.

Сега можете да продължите директно към проверката на номера. Всички компании за кредитни карти използват уникален цифров формат. Примерът използва това и клиентът не трябва да въвежда името на фирмата - то се определя от номера. Картите Visa винаги започват с 4 и имат номер с дължина 13 или 16 цифри. MasterCard започва в диапазона 51-55 с дължина на числото 16. В резултат на това получаваме следния израз:

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

Проверка на телефонни номера

Задача.Проверка коректността на въведения телефонен номер.

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

+CCC.NNNNNNNNNNxEEEE,Където:

C е кодът на държавата, състоящ се от 1-3 цифри.

N - число с дължина до 14 цифри.

E - разширение по избор.

Плюсът е задължителен елемент, а знакът x присъства само когато е необходимо разширение.

В резултат на това имаме следния израз:

^\+(1,3)\.(4,14)(?:x.+)?$

Числа в диапазон

Задача.Трябва да съответствате на цяло число в определен диапазон. Освен това е необходимо регулярните изрази да съответстват само на числа от диапазон от стойности.

Решение. Ето някои изрази за някои от най-често срещаните случаи:

Намиране на IP адрес

Задача.Трябва да определите дали дадения низ е валиден IP адрес във формат IPv4 в диапазона 000.000.000.000-255.255.255.255.

Решение.Както при всяка задача в PHP, регулярните изрази имат много вариации. Например това:

Онлайн проверка на израза

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

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


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


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


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


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

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

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

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

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

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

Abvg ACZms

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

АБВ КЪДЕ АБВ КЪДЕ

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

Метасимволи за указване на специални знаци
() Скоби. Дефинира вложени изрази.
| Метазнак за избор
^ Метасимвол за начало на ред
$ Метазнак за край на реда
Символ за подаване на ред (шестнадесетичен код 0x0A)
\r Символ за връщане на каретка (шестнадесетичен код 0x0D)
\T Табул (шестнадесетичен код 0x09)
\xhh Вмъкването на знак с шестнадесетичен код 0xhh, например \x42 ще вмъкне латинската буква "B"
Метасимволи за указване на групи от знаци
. Точка. Всеки характер.
Цифра (0-9)
Не е число (всеки знак с изключение на знаци 0-9)
Празен знак (обикновено интервал и раздел)
Непразен знак (всички освен знаци, идентифицирани от метасимвола \s)
\w Знак от „речник“ (знак, който се използва в думи. Обикновено всички букви, всички цифри и долна черта („_“))
\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-Yaa-ya] (1,3)

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

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

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

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

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

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

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

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

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

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

и вземете необходимото съвпадение "ma".

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

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

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

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

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

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

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

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

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

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

1,6K

Регулярни изрази (съкратено като regex) са последователности от знаци, които образуват модели за търсене. Те се използват предимно в модели за съвпадение на низове.

Разказ

  • Всичко започна през 40-те до 60-те години на миналия век, когато много умни хора говореха за регулярни изрази;
  • 1970 g/re/p;
  • 1980 Perl и Хенри Спенсър;
  • 1997 PCRE (съвместими с Perl регулярни изрази). Тогава започва възходът на това, което наричаме регулярни изрази. PCRE предоставя библиотеки за почти всеки език.

Обща употреба на регулярни изрази в PHP

PHP включва три основни функции за работа с PCRE - preg_match, preg_match_all и preg_replace.

Сравнение на съответствието

Изразът връща 1, ако има съвпадение, 0, ако не, и false, ако възникне грешка:

int preg_match (низ $pattern, низ $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]])

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

int preg_match_all (низ $pattern, низ $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

Замяна

Изразът връща заменения низ или масив ( въз основа на $subject):

mixed preg_replace (смесен $pattern, смесен $replacement, смесен $subject [, int $limit = -1 [, int $count ]])

Обща употреба на регулярни изрази в JavaScript

Регулярните изрази в JavaScript изглеждат почти по същия начин като в PHP.

Сравнение на съответствието

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

string.match(RegExp);

Замяна

Регулярен израз, който връща низ с направените замествания:

string.replace(RegExp, заместване);

Характеристики на регулярните изрази в JavaScript

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

Принципи на съставяне на модели на регулярни изрази

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

Аналогови гнезда

Регулярните изрази се състоят от два типа знаци:

  • Специални символи: ? * + () () ^ $ / .
  • Литерали.

Представете си входните низове като болтове, а шаблона като набор от съединители за тях (в съответния ред).

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

Когато тествате регулярни изрази, трябва да знаете как работят специалните знаци:

  • Символът обратна наклонена черта \ може да замени друг специален знак в регулярен израз:
  • Точка и w - .

Съвпадение на всички знаци с изключение на новите редове. Ако искате да проверите за съответствие с точка и само с точка - , за съответствие с букви, цифри и долни черти - w

  • Квадратни скоби .

Съвпадение на знаци в скоби. Поддържа диапазони. Няколко примера:
o - съвпада с всяко a, b или c.
o главни букви.
o всяко число.
o – Съвпада с всяка малка или главна буква.
Не е задължително? Съвпадение 0 или 1.
Звездичка *.

Звездичката означава 0 или повече символа.

Съвпадение на 1 или повече знаци.

Къдрави скоби ().

Минимални и максимални стойности. Някои примери за синтаксис на регулярен израз:
o (1,) не по-малко от 1.
o (1,3) от 1 до 3.
o (1,64) от 1 до 64.

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

/+@+(.+)*/i


Ето как изглежда в PHP:

preg_match_all("/+@+(.+)*/i", $input_lines, $output_array);

Използване на регулярен израз за проверка

Предизвикателство: Уверете се, че входните данни са това, което очакваме. Цел 1: /[^w$.]/ Цел 2: /^(1,2)$/

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

Кога не трябва да използвате регулярен израз за проверка?

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

filter_var(" [имейл защитен]“, FILTER_VALIDATE_EMAIL)

Валидиране с помощта на регулярни изрази

Регулярните изрази в края на реда използват котви:

^ - показва началото на ред.
$ е знак за долар, който показва края на ред.

if (!preg_match("%^(1,2)$%", $_POST["subscription_frequency"])) ( $isError = true; )

Изключени класове знаци

[^abc] - всичко освен a, b или c, включително нови редове.

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

if (preg_match("/[^0-9a-z-_.]/i", $productCode)) ( $isError = true; )

Търсене и замяна

Най-често срещаните PCRE функции за извършване на търсене и замяна са preg_replace() и preg_replace_callback(). Но има и preg_filter() и preg_replace_callback_array(), които правят почти същото. Моля, обърнете внимание, че функцията preg_replace_callback_array() е налична от PHP7 насам.

Замяна на думи в списък

$subject = "Искам да ям малко ябълки."; echo preg_replace("/ябълка|банан|портокал/", "плод", $subject);

Резултат

Искам да ям малко плодове.

Ако регулярен израз има подмодели ( в скоби), можете да замените $N или N (където N е цяло число >= 1), това се нарича „обратна връзка“.

Пренареждане на две числа

$subject = "7/11"; echo preg_replace("/(d+)/(d+)/", "$2/$1", $subject);

Резултат

Промяна на форматирането на датата

$subject = "2001-09-11"; echo preg_replace("/(d+)-(d+)-(d+)/", "$3/$2/$1", $subject);

Резултат

Прост пример за замяна на URL в таг

$subject = "Моля, посетете https://php.earth/doc за още статии."; echo preg_replace("#(https?://([^s./]+(?:.[^s./]+)*[^s]*))#i", "$2", $subject) ;

Резултат