Начало / Интернет / PHP регулярни изрази preg съответстват. Регулярни изрази в php. Замяна на двойни кавички с интелигентни кавички

PHP регулярни изрази preg съответстват. Регулярни изрази в php. Замяна на двойни кавички с интелигентни кавички


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


Регулярните изрази са изрази, написани на специален език.


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


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

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

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

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

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

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

Abvg ACZms

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

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

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

Метасимволи за указване на специални знаци
() Скоби. Дефинира вложени изрази.
| Метазнак за избор
^ Метасимвол за начало на ред
$ Метасимвол за край на реда
\n Символ за подаване на ред (шестнадесетичен код 0x0A)
\r Символ за връщане на каретка (шестнадесетичен код 0x0D)
\t Табул (шестнадесетичен код 0x09)
\xhh Вмъкването на знак с шестнадесетичен код 0xhh, например \x42 ще вмъкне латинската буква "B"
Метасимволи за указване на групи от знаци
. Точка. Всеки характер.
\d Цифра (0-9)
\D Не е число (всеки знак с изключение на знаци 0-9)
\s Празен знак (обикновено интервал и раздел)
\S Непразен знак (всички освен знаци, идентифицирани от метасимвола \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".

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как да намеря това писмо? Може да има всяка буква от английската азбука, така че как можете да я идентифицирате? Вие сами отговорихте на въпроса си, има всяка буква, тоест тя е в диапазона от 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 "Няма числа!";

Как постигнахме това? Влязохме в символа, но!

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

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

Моят блог

$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 блог, обявявам първата част от поредицата за приключена!

Регулярните изрази ви позволяват да намерите последователности в низ, които съответстват на шаблон. Например шаблонът „Vasya(.*)Pupkin“ ще ви позволи да намерите последователност, когато има произволен брой знаци между думите Vasya и Pupkin. Ако трябва да намерим шест цифри, тогава пишем „(6)“ (ако, например, от шест до осем цифри, тогава „(6,8)“). Това разделя неща като индикатора за набор от символи и индикатора за необходими числа:

Вместо набор от знаци може да се използва обозначение на произволен знак - може да се посочи определен набор от знаци (поддържат се последователности - споменатите "0-9"). Може да означава „освентози комплект

знаци". Броят на символите се нарича "квантор" в официалната документация на PHP. Терминът е удобен и не носи недоразумения. И така, кванторът може да има или конкретна стойност - или една фиксирана стойност (“(6)”), или числов интервал (“(6,8)”), или абстрактно “всяко число, включително 0” (“( “ *"), "всекиестествено число

" - от 1 до безкрайност ("+": "document+.txt"), "0 или 1" ("?"). Кванторът по подразбиране за този набор от знаци е едно ("document.txt").

За по-гъвкаво търсене на комбинации, тези връзки „набор от знаци - квантор“ могат да бъдат комбинирани в метаструктури.

Като всеки гъвкав инструмент, регулярните изрази са гъвкави, но не абсолютно: тяхната област на приложение е ограничена. Например, ако трябва да замените един фиксиран низ в текста с друг, отново фиксиран, използвайте str_replace. Разработчиците на PHP сълзливо ви молят да не използвате сложни функции ereg_replace или preg_replace за тази цел, защото когато се извикат, се случва процесът на интерпретация на низове и това сериозно изразходва системни ресурси. За съжаление, това е любимият рейк на начинаещите PHP програмисти. Използвайте функции за регулярен израз само ако не знаете точно какъв низ има. Примери: код за търсене, в който служебните знаци и кратките думи са изрязани от низа за търсене, както и допълнителните интервали са изрязани (или по-скоро всички интервали са компресирани: „+“ се заменя с един интервал). Използвайки тези функции, проверявам имейла на потребителя, който оставя своя преглед. Има много неща, които могат да се направят, но е важно да имате предвид, че регулярните изрази не са всемогъщи. Например сложна замяна вПо-добре е да не ги правите. В края на краищата, например, комбинацията “(.*)” в термините на програмата означава търсене през всички символи на текста. И ако шаблонът не е обвързан с началото или края на реда, тогава самият шаблон се „премества“ от програмата през целия текст и резултатът е двойно търсене или по-скоро търсене на квадрат. Не е трудно да се досетите, че друга комбинация „(.*)“ означава итерация върху куб и т.н. Повдигнете, да речем, 5 килобайта текст на трета степен. Оказва се 125 000 000 000 (с думи: сто двадесет и пет милиарда операции). Разбира се, ако се подходи стриктно, няма да има толкова много операции, но четири до осем пъти по-малко, но самият ред на числата е важен.

Набор от знаци
. точкапроизволен характер
[] квадратни скобисимволен клас ("всеки от"). например
[^] клас отрицателен символ ("всички освен")
- тиреобозначение на последователност в символен клас ("" цифри)
\d Само цифри
\D[^0-9] Освен числата
\w Букви и цифри
\W[^a-z0-9]Освен букви и цифри
\s Празни знаци: интервал, раздел, нов ред
\S[^ ] С изключение на празните знаци
| (един|друг)На това място може да има една от изброените опции, например: (Вася|Петя|Маша). Ако не искате да бъде включено в селекцията, използвайте (?: ...)

Не използвайте символен клас, за да обозначите само един (вместо "+" "+" ще свърши добра работа). Не пишете точка в класа на знаците; това е който и да е символ, тогава другите знаци в класа просто ще бъдат излишни (и в отрицателен кластова ще доведе до отричане на всички знаци).

Квантор

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

{ }

{ , }

Ако трябва да посочите само необходимия минимум, но няма максимум, просто поставете запетая и не пишете второто число: „(5,)“ („минимум 5“). Има специални обозначения за най-често използваните квантори:

На практика такива символи се използват по-често от фигурните скоби.

Котви

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

Алчност Въпросителният знак също действа като минимизатор на квантори:
.*?

Резултат от примера: Алчна версия: удебелен текст [b]и тук - върнат още по-смел Мързелива версия: удебелен текст [b]и тук - върнат още по-смел

Редът на шаблона, както вече забелязахте, започва и завършва с наклонени черти. След втория има параметри:

азтърсене без значение за главни и малки букви
м

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

sКогато тази опция е зададена, "^" и "$" съответстват на началото и края на отделните редове.
символ "." (точка) също съответства на прекъсване на ред (не по подразбиране)А
прикрепете към началото на текстад
Uпринуждава знака "$" да съответства само на края на текста.
Игнорира се, ако е зададен параметър m.Обръща "greedy" за всеки квантор (ако квантификатор е последван от "?", този квантор вече не е "greedy").
д
  • Заместващият низ се интерпретира като PHP код.
  • Функции за работа с регулярни изрази preg_grep preg_match - Извършва проверка на съвпадение
  • регулярен израз
  • . Тази функция търси само първото съвпадение! preg_match_all preg_quote - Избяга от знаци в регулярни изрази.
  • Тези. вмъква наклонени черти преди всички служебни знаци (например скоби,
  • квадратни скоби
  • и т.н.), така че да се приемат буквално. Ако имате някакъв потребителски вход и го проверявате с помощта на регулярни изрази, тогава е по-добре да избегнете служебните знаци във входящата променлива, преди да го направите
preg_replace

preg_replace_callback - Извършва търсене и заместване на регулярен израз

preg_split

preg_grep

функция preg_grep - Връща масив от събития, които съответстват на шаблон

Синтаксис

масив preg_grep (модел на низ, въвеждане на масив [, int флагове])
preg_grep() връща масив, състоящ се от елементите на входния масив, които отговарят на дадения модел. Параметърът flags може да приема следните стойности: PREG_GREP_INVERT
Ако този флаг е зададен, функцията preg_grep() ги връща
елементи на масива

, които не отговарят на дадения образец на шаблона.

Резултатът, върнат от preg_grep(), използва същите индекси като оригиналния масив от данни. Ако това поведение не ви устройва, използвайте array_values() върху масива, върнат от preg_grep(), за да преиндексирате.

Примерен код:

preg_split

// Връща всички елементи на масива // съдържащи числа с плаваща запетая $fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);

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

флаговете могат да приемат следните стойности:

PREG_OFFSET_CAPTURE

Търсенето се извършва отляво надясно, от началото на реда. Незадължителният параметър за отместване може да се използва за указване на алтернативна начална позиция за търсене. Подобен резултат може да се постигне чрез замяна на subject с substr())($subject, $offset).

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

Препоръка: Не използвайте функцията preg_match(), ако трябва да проверите за наличието на подниз в даден низ. Използвайте strpos() или strstr() за това, тъй като те ще изпълнят задачата много по-бързо.

Примерен код Примерен код Примерен код Резултат от примера:

името на домейна е: сайт

preg_match_all

preg_match_all функция - Извършва глобално търсене на шаблон в низ

preg_split

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

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

След намиране на първото съвпадение последващите търсения ще се извършват не от началото на низа, а от края на последното намерено срещане.

Незадължителният параметър за флагове може да комбинира следните стойности (имайте предвид, че използването на PREG_PATTERN_ORDER едновременно с PREG_SET_ORDER е безсмислено):

PREG_PATTERN_ORDER
Ако този флаг е зададен, резултатът ще бъде подреден по следния начин: елементът $matches съдържа масив от пълни срещания на шаблона, елементът $matches съдържа масив от срещания на първия подмодел и т.н.

Примерен код Резултат от примера: пример: , това е тест пример: , това е тест

Както виждаме, $out съдържа масив от пълни срещания на шаблона, а елементът $out съдържа масив от поднизове, съдържащи се в таговете.

PREG_SET_ORDER
Ако този флаг е зададен, резултатът ще бъде подреден по следния начин: елементът $matches съдържа първия набор от срещания, елементът $matches съдържа втория набор от срещания и т.н.

Примерен код Резултат от примера: пример: , пример: това е тест, това е тест

В този случай масивът $matches съдържа първия набор от съвпадения, а именно: елементът $matches съдържа първото появяване на целия шаблон, елементът $matches съдържа първото появяване на първия подмодел и т.н. По подобен начин масивът $matches съдържа втория набор от съвпадения и така нататък за всяко намерено съвпадение.

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

В случай, че не се използва флаг, по подразбиране е PREG_PATTERN_ORDER.

Търсенето се извършва отляво надясно, от началото на реда. Незадължителният параметър за отместване може да се използва за указване на алтернативна начална позиция за търсене. Подобен резултат може да се постигне чрез замяна на subject с substr())($subject, $offset).

Връща броя на срещанията на намерения шаблон (може да бъде нула) или FALSE, ако са възникнали грешки по време на изпълнение.

Примерен код Примерен код Резултат от примера: съвпадение: удебелен текст част 1: част 2: удебелен текст част 3: съвпадение: щракнете върху менчаст 1: част 2: щракнете върху мен част 3: preg_quote

функция preg_quote - Ескейпване на знаци в регулярни изрази

preg_split

низ preg_quote (низ str [, разделител на низ])

Функцията preg_quote() взема низа str и добавя обратна наклонена черта преди всеки специален знак. Това може да бъде полезно, ако шаблонът включва низови променливи, чиято стойност може да се промени по време на операцията на скрипта.

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

В регулярните изрази следните символи се считат за служебни: . \\ + * ? [ ^ ] $ () ( ) = !< > | :

Примерен код Примерен код Резултат от примера: Тази книга е *много*трудно за намиране. preg_replace

preg_replace функция - Извършва търсене и замяна с помощта на регулярен израз

preg_split

mixed preg_replace (смесен шаблон, смесена замяна, смесен предмет [, int limit])

Търси в субекта на низа съвпадения на шаблон и ги заменя със замяна. Ако параметърът limit е посочен, срещанията на limit на шаблона ще бъдат заменени; ако ограничението е пропуснато или равно на -1, всички срещания на шаблона ще бъдат заменени.

Заместването може да съдържа препратки във формата \\n или (от PHP 4.0.4) $n, като последното е за предпочитане. Всяка такава препратка ще бъде заменена с n-тия подмодел, заграден в скоби, като препратката \\0 (или $0) съответства на поява на целия подмодел номерирани отляво надясно, започвайки с едно.

Когато използвате заместване със заместващи знаци, използвайки препратки към подмодели, може да възникне ситуация, при която маската е непосредствено последвана от число. В този случай нотация като \\n води до грешка: препратка към първия подмодел, последвана от числото 1, ще бъде написана като \\11, което ще се интерпретира като препратка към единадесетия подмодел. Това недоразумение може да бъде елиминирано чрез използване на конструкцията \$(1)1, която показва изолирана препратка към първия подмодел, последван от цифрата 1.

Примерен код

Резултатът от този пример ще бъде:

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

Първите три параметъра на preg_replace() могат да бъдат едномерни масиви. В случай, че масивът използва ключове, при обработката на масива те ще бъдат взети в реда, в който са разположени в масива. Указването на ключовете в масива за шаблон и заместване не е задължително. Ако все пак решите да използвате индекси, за да съответствате на моделите и низовете, включени в замяната, използвайте функцията ksort() за всеки от масивите.

Черната бавна мечка прескочи мързеливото куче.

Използвайки ksort(), получаваме желания резултат:

Бавната черна мечка прескочи мързеливото куче.

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

Ако шаблонът и параметрите за замяна са масиви, preg_replace() алтернативно извлича чифт елементи от двата масива и ги използва за операцията за търсене и замяна. Ако заместващият масив съдържа повече елементи от модела, ще бъдат взети празни низове, за да заменят липсващите елементи. Ако шаблонът е масив и замяната е низ, всеки елемент от масива с шаблон ще бъде претърсен и заменен с шаблон (всички елементи на масива ще бъдат шаблонът на свой ред, докато низът за заместване остава фиксиран). Опцията, когато моделът е низ, а заместването е масив, няма смисъл.

Модификаторът /e променя поведението на функцията preg_replace() по такъв начин, че заместващият параметър, след извършване на необходимите замествания, се интерпретира като PHP код и едва тогава се използва за заместване. Когато използвате този модификатор, бъдете внимателни: заместващият параметър трябва да съдържа валиден PHP код, в противен случай ще възникне синтактична грешка в реда, съдържащ извикването на функцията preg_replace().

Примерен код: Заменете с няколко шаблона

Този пример ще изведе:

$startDate = "5/27/1999";

Примерен код: Използване на модификатора /e Примерен код: Преобразува всички HTML тагове в главни букви preg_replace_callback

preg_replace_callback функция - Извършва търсене и заместване на регулярен израз с помощта на функция за обратно извикване

preg_split

mixed preg_replace_callback (смесен модел, обратно извикване, смесен предмет [, int limit])

Поведението на тази функция е в много отношения подобно на preg_replace(), с изключение на това, че вместо параметъра за заместване, трябва да посочите функция за обратно извикване, на която се предава масив от намерени събития като входен параметър. Очакваният резултат е низът, който ще бъде заменен.

Примерен код (.*?).")", $xml, $съответствия, PREG_PATTERN_ORDER);

върне $ съвпадения; )

Търсене на XHTML/XML тагове с конкретна стойност на атрибут

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

Функция get_tag($attr, $value, $xml, $tag=null) ( if(is_null($tag)) $tag = "\w+"; else $tag = preg_quote($tag); $attr = preg_quote($ $value = preg_quote($value); $tag_regex = "/]*$attr\s*=\s*". .*?)/" preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); върне $matches; )

Още един полезен инструмент за уеб разработчици! Позволява ви да намерите/проверите шестнадесетични цветови стойности.

$string = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i", $string)) ( echo "пример 6 успешен.";)

Търсете заглавие на статията

Този кодов фрагмент ще намери и покаже текста в таговете на html страница.

$fp = fopen("http://www.catswhocode.com/blog","r"); докато (!feof($fp))( $page .= fgets($fp, 4096); ) $titre = eregi("(.*)",$page,$regs); ехо $regs; fclose($fp);

Разбор на регистрационни файлове на Apache

Повечето сайтове работят на добре познатия уеб сървър Apache. Ако вашият сайт е един от тях, защо не използвате PHP и регулярни изрази за анализиране на регистрационните файлове на Apache?

//Дневници: уеб сървър на Apache //Само успешни посещения на HTML файлове. Полезно за отчитане на броя показвания на страници. "^((?#клиентски IP адрес или име на домейн)S+)s+((?#основно удостоверяване)S+s+S+)s+[((?#дата и час)[^]]+)]s+"(?: GET|POST|HEAD) ((?#file)/[^ ?]+?.html?)??((?#parameters)[^ ?]+)? HTTP/+"s+(?#статус код)200s+((?#прехвърлени байта)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#потребителски агент )[^"]*)"$" //Регистри: уеб сървър на Apache //само 404 грешки "^((?#клиентски IP адрес или име на домейн)S+)s+((?#основно удостоверяване)S+s+S+) s+[((?#дата и час)[^]]+)]s+"(?:GET|POST|HEAD) ((?#файл)[^ ?"]+)??((?#параметри)[ ^?"]+)? HTTP/+"s+(?#статус код)404s+((?#прехвърлени байта)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#потребителски агент )[^"]*)"$"

Замяна на двойни кавички с интелигентни кавички

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

Preg_replace("B"b([^"x84x93x94rn]+)b"B", "?1?", $текст);

Изчерпателна проверка на паролата

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

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

„A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?) [-_a-zA-Z0-9](6,)z"

WordPress: Използване на регулярен израз за получаване на изображения от публикация

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

За да използвате този код, просто го поставете във всеки файл във вашата тема.