Uy / Windows haqida umumiy ma'lumot / Php muntazam qator raqamidan. PHP regexp: muntazam ifodalarga misollar. Oddiy ifodalarga misollar

Php muntazam qator raqamidan. PHP regexp: muntazam ifodalarga misollar. Oddiy ifodalarga misollar

Keling, muntazam ifoda nima ekanligini bilib olaylik. Xo'sh, menga bu savolga javob bering: "test" so'zida "e" bormi? "Yeng!" deysiz. Keyin sizga ikkinchi savol beraman test so'zida "e" harfini qanday topdingiz? Javob aniq, biz birinchi belgini, ya'ni "t" ni olamiz va uni biz izlayotgan narsa bilan, ya'ni "e" bilan solishtiramiz. Agar ular teng bo'lmasa, biz ikkinchi belgini, ya'ni "e" ni olamiz va uni biz izlayotgan narsa, ya'ni "e" bilan solishtiramiz. Voila! Gugurt topildi. Javob: "Test" so'zi "e" harfini o'z ichiga oladi..

Endi menga yana bir savolga javob bering, bu misoldagi muntazam ibora qayerda? Umid qilamanki, siz bu erdagi muntazam ibora biz "sinov" so'zidan qidirayotgan narsa ekanligini taxmin qildingiz. Ya’ni bu misoldagi “e” harfi muntazam ifodadir.

PHPda muntazam ifodalar nima uchun ishlatiladi? Mening amaliyotimda, masalan, manzil to'g'ri tuzilgan yoki yo'qligini aniqlash uchun muntazam iboralar ishlatilgan elektron pochta. Bunday iboralar foydalanuvchi nomi va parolning to'g'riligini aniqlash uchun ham qo'llaniladi. Muntazam iboralar yordamida siz havoladagi manzilni topishingiz va uni saqlashingiz mumkin. Buni tahlil qilish orqali siz ko'p narsalarni qilishingiz mumkin, siz muntazam iboralarning asosiy funktsiyasini va ikki tomonni aniqlashingiz mumkin. Asosiy funktsiya , bu satrdagi mosliklarni qidirish. Yon ta'siri topilgan o'yinlarni saqlash va ularni almashtirishni o'z ichiga oladi.

Birinchi muntazam ifoda

Nazariy jihatdan, biz "test" so'zida "e" belgisini qanday topishni tushunamiz, ammo bu amalda qanday amalga oshiriladi? PHP da muntazam ifodalardan foydalanish uchun odatda quyidagi funksiyalardan foydalaniladi:

preg_match("muntazam ifoda (naqsh)", "qidiruv amalga oshiriladigan o'zgaruvchi", "Qidiruv natijasi saqlanadigan o'zgaruvchi (ixtiyoriy parametr)"); - Moslash funktsiyasi
preg_replace("normal ifoda (naqsh)", "Topilgan moslikni nima bilan almashtirish kerak", "almashtiriladigan o'zgaruvchi"); - Funktsiyani almashtirish

Keling, ushbu funktsiyalardan foydalanishni boshlaymiz: "test" so'zida "e" belgisini qidirish.

$a = "sinov";
if(preg_match("/e/",$a)) echo "topildi!!";

Kod shartni ta'riflaydi: agar $a o'zgaruvchisida naqshga mos keladigan narsa topilsa, "topildi!!" xabarini ko'rsating. Siz sezgan bo'lsangiz kerak, bizning shablonimiz ikkita "/" orasida joylashgan. IN Ushbu holatda belgisi "/" naqshimizning boshlanishi va oxirini ramziy qiladi. Umid qilamanki, bu aniq.

Bularning barchasi qiziq, albatta... lekin bizning shablonimiz juda oddiy, shunday emasmi? Axir, biz kamdan-kam hollarda o'zgaruvchida biron bir belgini topishimiz kerak. Aksariyat hollarda biz ko'plab belgilarni, shuningdek, noma'lumlarni topishimiz kerak. Bu qanday bo'lishi mumkin? Keling, o'zimizga muammo qo'yaylik va uni hal qilishga harakat qilaylik. Faraz qilaylik, bizda raqamlar va bitta noma'lum ingliz harflaridan iborat qator bor

Bu xatni qanday topish mumkin? Ingliz alifbosining har qanday harfi bo'lishi mumkin, shuning uchun uni qanday aniqlash mumkin? Siz o'zingiz savolingizga javob berdingiz, har qanday harf bor, ya'ni u a dan z gacha. Muntazam ifodalarda diapazonlardan foydalanishingiz mumkin. Agar biz qaysi belgini qidirayotganimizni bilmasak, lekin bu belgi ingliz alifbosining harfi ekanligini aniq bilsak, unda yozuv quyidagicha bo'ladi:

$a = "123a321";
if(preg_match("//",$a)) echo "topildi!!";

E'tibor bering, diapazon "[" "]" qavslar ichiga olingan. Bunday qavs ichiga olingan hamma narsa quyidagicha aniqlanadi bitta belgisi, bu holda belgi a dan z gacha. Agar biz harfni emas, balki raqamni topishimiz kerak bo'lsa, unda yozuv quyidagicha bo'ladi:

$a = "abc1cba";
if(preg_match("//",$a)) echo "topildi!!";

Shuni ham ta'kidlashni istardimki, oddiy iboralar katta-kichik harflarga sezgir, shuning uchun "A" va "a" belgilari butunlay boshqacha, ikkala belgini qidirish uchun shunday yozing:

$a = "123a321";
if(preg_match("//",$a)) echo "topildi!!";

Ingliz tilidagi kabi ruscha harflarni qidirish ham mavjud:

$a = "123×321";
if(preg_match("/[a-zA-Z]/",$a)) echo "topildi!!";

Meta belgilar

Biz satrda noma'lum belgini qanday qidirishni o'rgandik. Agar bir nechta belgilarni topishimiz kerak bo'lsa, nima qilish kerak? Metasimbollar deb atalmishlar yordamga keladi... Faraz qilaylik, bizda raqamlar va harflardan iborat ip bor, uni shablonda qanday tasvirlashimiz mumkin? Buni qilishingiz mumkin:

qator - 123a321
namuna -

Hmm... shablon aslida bizning satrimizga mos keladi va muvofiqlik tekshirilganda u uzoq kutilgan haqiqatni beradi! Lekin bu qandaydir noqulay rekord, shunday emasmi?

Buni qanday qisqartirish mumkin:

qator - 123a321
namuna - *

Menimcha, bu "*" belgisi nima? Bu xuddi shu metasimbol, ya'ni biz tasvirlagan belgi (ya'ni, 0 dan 9 gacha raqamlar yoki ingliz alifbosining harflari, a dan z gacha bo'lgan belgi) cheksiz yoki bir necha marta takrorlanishi mumkin. Ha ha! Ushbu metasimbol bo'sh o'zgaruvchida moslikni topadi, chunki biz tasvirlagan belgining yo'qligi ham haqiqatga qaytadi! Buni eslab qoling

Yana qanday meta-belgilar mavjud?

Masalan, "+" meta-belgisi, bitta kichik istisno bilan deyarli "*" meta-belgisiga o'xshaydi. "*" belgisi bo'lmasa ham true qiymatini qaytaradi va "+" kamida bitta belgi mavjudligini tekshiradi. Ya'ni, agar chiziq mavjudligini talab qilsa minimal bir belgi keyin "*" o'rniga "+" dan foydalaning

Metabelgi ham tez-tez ishlatiladi. Bu shuni anglatadiki, qatorda bittadan ortiq kerakli belgilar bo'lmasligi kerak. Men tasvirlagan oxirgi ikki meta-belgi uchun bir nechta misol keltiraman.

Aytaylik, foydalanuvchi parolining to'g'riligini tekshirishimiz kerak. Keling, foydalanuvchi paroli nimani o'z ichiga olishi haqida o'ylab ko'raylik? Birinchidan, u kamida bitta belgi bo'lishi kerak. Ikkinchidan, u faqat ingliz alifbosining raqamlari va harflarini o'z ichiga olishi kerak, shuning uchun oddiy ibora quyidagicha ko'rinadi:

$a = "qwerty12345";

Biz qanday belgilarga ruxsat berdik? Har qanday harf va raqamlarning inglizcha harflari. Endi parol o'rniga bo'sh qator qoldirib ko'ring.

$a = "";
if(preg_match("/+/",$a)) echo "Parol to'g'ri";

Siz "Parol to'g'ri" xabarini ko'rmaysiz. Nega? Chunki "+" meta-belgi satrda kamida bitta belgi bor yoki yo'qligini tekshirdi.

Endi biroz hiyla-nayrang, keling, ifodamizni ko'rib chiqaylik, biz ruxsat bermadik, mayli, unda bo'sh joy deylik, to'g'rimi? parol oxirida bo'sh joy qo'ying va ishga tushiring

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "Parol to'g'ri";

Va nima uchun biz to'g'ri parol haqidagi xabarimizni ko'ramiz? Bu juda oddiy... Funktsiya preg_match(); birinchi o'yinda tekshirishni to'xtatadi. Ya'ni, "q" belgisi biz tasvirlagan naqshga mos keladi va boshqa hamma narsa funktsiya uchun muhim emas. Buni qanday tuzatish kerak:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "Parol to'g'ri";

Ifodaning boshiga "^" va oxirida "$" qo'shish orqali biz funktsiyaga naqsh nimaga mos kelishi kerakligini aytamiz. hammasi chiziq. Agar siz ushbu kodni ishga tushirsangiz, siz xabarni ko'rmaysiz, chunki parol oxirida noqonuniy belgi - bo'sh joy mavjud.

Endi "+" meta-belgisini "?" ga o'zgartiring. Nima bo'ladi deb o'ylaysiz? To'g'ri, parolning to'g'riligi haqida xabar bo'lmaydi, chunki parolda bir nechta belgilar mavjud. Umid qilamanki, men ushbu uchta tez-tez ishlatiladigan meta-belgilarning ishini to'g'ri tushuntirdim

Ba'zan "yo'q" yaxshiroq

Biz hech bo'lmaganda parolning to'g'riligini tekshirishni o'rgandik va bu yaxshi! Men sizga satrda biror narsani qidirishning yana bir usuli haqida gapirib beraman. Aytaylik, biz satrda raqamlar yo'qligini tekshirishimiz kerak. Buni qanday qilish kerak? Bu qator:

(Hayot asalga o'xshamasligi uchun men unga "-_+()" belgilarini maxsus kiritdim...) Quyidagi ifodani shakllantirishimiz mumkin:

Ammo tan olishingiz kerak, biz har doim ham qatorda qanday belgilar ishlatilishini bilmaymiz, lekin unda raqamlar bo'lmasligi kerakligini aniq bilamiz! Shuning uchun oddiygina qatorlarni o'tkazib yuboradigan shablonni yozish mantiqiyroq bo'ladi Yo'q bor raqamlar emas, balki raqamlar "Ey xudoyim, qanchalar tushunarsiz ramzlar!!!". Mana shunday muammolar uchun to'g'ri tuzilgan ifodaga misol:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "Raqamlar yo'q!";

Biz bunga qanday erishdik? Biz belgini kiritdik Lekin! boshida qo'yilgan qalpoq "^" ([^0-9]) bo'lishini bildiradi qilmaslik kerak Umid qilamanki, bu hal qilindi

Xo'sh, asta-sekin yakunlaylik... Men ikkita misolni tushuntirish bilan keltiraman, ular davomida qidiruv natijasini o'zgaruvchiga saqlashni o'rganamiz va pochta manzilining to'g'riligini tekshirishni o'rganamiz.

Men uni ko'rdim va saqladim!

Mening blogim

$a = " Mening blogim";
preg_match("/ /", $a);

Oddiy iboramizda biz havolaga kiritilishi mumkin bo'lgan barcha belgilarni tasvirlab berdik. Men iboramizdagi qo'shtirnoq va "/" belgilariga ham e'tibor qaratmoqchiman, ular oldida teskari chiziq qo'yilgan, bu nima uchun? Gap shundaki, "/" va iqtibosning o'zi maxsus belgilardir. Va shablon ularni oddiy belgilar sifatida qabul qilishi uchun biz ularni ekrandan o'tkazishimiz kerak. Ekranni moslashtirish maxsus belgilar oldiga teskari chiziq qo'shish orqali amalga oshiriladi. Umid qilamanki, bu aniq

$a = " Mening blogim";
preg_match("/ /", $a, $b);

Shunga ko'ra, topilgan havola saqlanadigan $b o'zgaruvchisi ko'rinishida qo'shimcha parametr qo'shish kerak. Bundan tashqari, qidiruv natijasi massivda joylashganligini bilishingiz kerak. Shuning uchun $b o'zgaruvchisi massivdir. Biz izlayotgan maʼlumot 1-indeks ostida. Bu qidiruv natijasi $b oʻzgaruvchisida ekanligini bildiradi. Natijani ekranda ko'rsatamiz:

$a = " Mening blogim";
preg_match("/ /", $a, $b);
echo $b;

To'g'ri manzil - muvaffaqiyat kaliti!

Va nihoyat, savolga javob, elektron pochta to'g'rimi? Birinchidan, manzillarda qanday belgilarga ruxsat berilganligini bilib olishingiz kerak? Men bilishimcha, ruxsat etilgan belgilarga quyidagilar kiradi:

  • Inglizcha harflar, raqamlar, "_", "-" ummmm hammasi shunday ko'rinadi ... Biz bundan davom etamiz.
  • Keyingi bizda "@"
  • Keyin inglizcha harflar
  • Keyingi, davr
  • Va yana ingliz harflari ...

Shunday qilib, muntazam ifoda quyidagicha bo'ladi:

$a = " [elektron pochta himoyalangan]";
if(preg_match("/^+@+.+$/", $a)) echo "elektron pochta manzili to'g'ri!";
else echo "elektron pochta manzili to'g'ri yozilmagan!";

Xo'sh... Umid qilamanki, bunday yozuvlar sizni hozir qo'rqitmaydi va siz ularni yaxshi tushunasiz.

Va nihoyat, men bir narsani aytmoqchiman. Maqola og'ir bo'lib chiqdi va shu bilan birga imkoniyatlarning faqat bir qismini qamrab oldi. Agar siz ushbu jumlani o'qiyotgan bo'lsangiz, unda siz uni oxirigacha o'qib chiqdingiz, buning uchun sizga katta rahmat

Cms blogini ishlab chiqish haqidagi maqolalar turkumiga kelsak, seriyaning birinchi qismi Men uni yopiq deb e'lon qilaman! Yaqin kelajakda biz administrator panelini amalga oshirishni boshlaymiz, shuning uchun "almashtirmang" Agar sizda biron bir savol bo'lsa, men javob berishdan xursand bo'laman. Sizga eng yaxshi tilaklar, menda bor narsa shu!

) Men sizga sahifaning manba kodining muayyan qismlarini topish uchun muntazam iboralardan foydalanish misolini ko'rsatdim. Endi biz ularni o'zimiz yozishni o'rganamiz. Bu mahorat sizga yozish, keraksiz bo'laklardan matnni tozalash, katta hajmdagi matnlarda kerakli qismlarni qidirish va hokazolarga yordam beradi.

Bu mavzu juda murakkab, ammo men eng ko'pini qisqacha yoritishga harakat qilaman muhim nuqtalar. Men qanchalik muvaffaqiyat qozonishimni bilmayman, lekin dars foydali bo'ladi deb umid qilaman.
Shunday qilib, keling, PHPda oddiy iboralar bilan ishlash uchun bir nechta funksiyalar mavjudligidan boshlaylik, lekin ko'pincha uchtasi qo'llaniladi:

  • preg_replace — oddiy ifodaga mos keladigan matnni qidirish va almashtirish;
  • preg_match - oddiy qidiruv;
  • preg_split - matnni qidirish va ajratish.

Hech bo'lmaganda, oldingi darslarda biz ulardan foydalanganmiz. Aniqrog'i, preg_match o'rniga preg_match_all bor edi, lekin bu aslida bir xil narsa, faqat ikkinchisi birinchi topilmadan keyin qidiruvni to'xtatmaydi. Ya'ni, agar biz preg_match dan foydalansak, biz barcha hodisalarni emas, balki faqat birinchisini topamiz.

Qaysi vaziyatda qaysi funksiyadan foydalanishni tanlash juda oddiy. Biz almashtirishimiz kerak - biz sahifa kodining keraksiz qismlarini olib tashlashimiz kerak bo'lgan holatda bo'lgani kabi, almashtirish dan foydalanamiz, esingizdami?

$page = preg_replace("/ ^]/i", "", $page); $page = preg_replace("/ ^]/i", "", $page); $page = str_replace("", "", $page);

Funktsiyaning birinchi parametri biz qidirayotgan narsani aniqlaydigan muntazam belgidir. Ikkinchisi, biz uni almashtiramiz. Uchinchi - Biz qayerga qarayapmiz? Shuning uchun, biz bu erda $page o'zgaruvchisini oldik va unga preg_replace funksiyasining natijasini tayinladik, bu erda biz barcha kiritish turi=checkbox, shuningdek, teglarni ochish va yopishni qidirdik. Ularni "" bilan almashtirdilar, ya'ni ularni shunchaki o'chirib tashladilar. Umid qilamanki, bu erda hamma narsa aniq. Birozdan keyin ifodaning o'zini (funktsiyaning birinchi parametri) tahlil qilishga o'tamiz.
Qolgan matndagi barcha havolalarni topish uchun foydali bo'lgan preg_match_all dan foydalanish misoli ham bor edi. Bizga havolalar kerak edi, chunki ular biz tahlil qilayotgan kalit so'zlarni o'z ichiga olgan. Mana nima bo'ldi:

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

Birinchi parametr yana "a" tegiga tabiiy ravishda kiritilgan barcha havolalarni topish uchun odatiy iboradir (agar siz html belgilash bilan tanish bo'lmasangiz, o'qing). Ikkinchisi izlanadigan matnni o'z ichiga olgan o'zgaruvchidir. Uchinchi parametr - bu natija joylashtirilgan o'zgaruvchi - $ok. Shundan so'ng, bizga kerakli kalitlarni olish uchun $ok ning barcha kerakli elementlaridan o'tish qoladi. Alohida aytish kerakki, chiqishda biz ko'p o'lchovli massivni olamiz. Shuning uchun biz uni shunday murakkab ko'rinishda ko'rsatdik: $ok[$j]. Massiv tuzilishini ko'rish uchun quyidagi funksiyadan foydalaning va siz hamma narsani tushunasiz.

Print_r($ok);

Ko'rinishidan, biz o'z ishimiz uchun foydalanadigan funktsiyalarni saralab oldik. Endi qolgan narsa bu usullarning har birining birinchi parametri bo'lgan bir xil muntazam iboralarni yozishni o'rganishdir. Keling, eng muhim narsaga o'taylik.

Oddiy jumlalarni qanday yozish kerak

Birinchidan, asosiy tuzilmalarni ko'rib chiqaylik. Ifodalarda variantlar mavjud. Ular bir harf bilan belgilanadi va oxirida, oldin slash bilan yoziladi.

Bundan tashqari, quyidagi meta-belgilar qo'llab-quvvatlanadi:

Metabelgilar, o'z navbatida, modifikatorlarga ega bo'lishi mumkin:

Xo'sh, endi biz o'tgan darsdagi odatiy naqshlarimizni tahlil qilishga o'tishimiz mumkin. Yuqoridagi belgilarga asoslanib, keling, bizda nima borligini tushunishga harakat qilaylik. Mana bu ifoda:

/^]/i

Birinchi va oxirgi “/” chiziqchalar ularning ichida muntazam ifoda borligini bildiradi. Shu bilan birga, oxirgisidan keyin biz "i" ni qo'yamiz, bu birinchi jadvaldagi kabi variant - vaziyatni hisobga olmang. Chiziqlar ichida muntazam ketma-ketlikning o'zi joylashgan. U kichikroq belgisi va kirish yorlig'i bilan boshlanadi va undan keyin keladigan barcha narsalar nuqta belgisi oddiy matnni izlash uchun qoladi. Lekin nuqtaning o'zi va undan keyingi belgilar qiziqroq. Bu holda konstruksiya “.*?” har qanday belgilar ketma-ketligini bildiradi. Ya'ni, agar biz faqat matnni va ushbu konstruktsiyani birlashtirsak, unda biz birinchi paydo bo'lgandan keyin va oxirigacha barcha matnni tanlaymiz. To'xtatish uchun siz HTML-ning "ko'proq" yorlig'i yoki yangi chiziq belgisiga duch kelishingiz kerak. Ushbu dizayn bizga shunday imkoniyat beradi:

Kvadrat qavs ichidagi belgilar mantiqiy OR bilan bog'langan. Oxiri belgidan kattaroq YOKI chiziqning boshi.
Bu barcha ifoda, unda biz boshlang'ich shartni, o'rta va yakuniy shartni o'rnatamiz. Qiyin emas, to'g'rimi? Aniqlik uchun rasm:

Keling, hamma narsani mustahkamlash uchun yana bir narsani ko'rib chiqaylik. Biz ular bilan bog'lanishni qidirdik:

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

Biz ifodani o'qiymiz. Shunga qaramay, biz avval slash va variantlarni o'chirib tashlaymiz. "Uis" bayroqlari o'z-o'zidan tushunarli, men ta'riflamagan "u" dan tashqari - bu biz Unicode kodlashdan foydalanayotganimizni ko'rsatadi. Ko'p narsa qolmadi. Boshlanish "a" yorlig'i bo'lib, u ochiladi, keyin sinf keladi

bu (HTML teglarini ochish va yopish) dan katta yoki kichik EMAS degan ma'noni anglatadi, ya'ni bu holda har qanday belgilar. Sinfga "+?" belgisi qo'shiladi, ya'ni bu sinf 1 yoki undan ortiq marta bo'ladi (lekin kamida 1 marta). Va keyin “a” tegi uchun yopilish html tegi keladi. Guruh tomonidan belgilangan havola ichida matn mavjud

Axir, biz u erda qanday matn bo'lishini bilmaymiz, shuning uchun biz bunday guruhni aniqlaymiz. Va oxirida "a" yorlig'i mavjud:

Esda tutingki, biz teskari chiziq yordamida qiya chiziqdan qochib qutulamiz, shunda u oddiy matn sifatida qabul qilinadi.

Voy. Mavzu haqiqatan ham juda murakkab, u amaliyotni talab qiladi. Ehtimol, men unchalik yaxshi bo'lmagan narsani qilyapman va boshqa, to'g'riroq muntazam iboralarni yaratishim mumkin, lekin men siz kabi o'zimni o'rgatganman, shuning uchun qat'iy hukm qilmang, aksincha o'z variantlaringizni sharhlarda baham ko'ring. Bundan tashqari, agar biror narsa aniq bo'lmasa, sharhlar va aloqa sahifasi sizning xizmatingizda.

Har qanday zamonaviy dasturlash tilidagi matnlar bilan ishlashda ishlab chiquvchilar doimiy ravishda kiritilgan ma'lumotlarni kerakli naqshga muvofiqligini tekshirish, test qismlarini qidirish va almashtirish va ramziy ma'lumotlarni qayta ishlash uchun boshqa odatiy operatsiyalarga duch kelishadi. O'z tekshirish algoritmlarini ishlab chiqish vaqtni yo'qotishga, dastur kodining mos kelmasligiga va uni ishlab chiqish va modernizatsiya qilishda murakkablikka olib keladi.

Internet va WEB ishlab chiqish tillarining jadal rivojlanishi matnli ma'lumotlarni qayta ishlash uchun universal va ixcham vositalarni yaratishni talab qildi, buning uchun zarur bo'lgan minimal kod miqdori. Yangi boshlanuvchilar va professional dasturchilar orasida mashhur bo'lgan PHP tili ham bundan mustasno emas. Matn shablonlari tili sifatida muntazam ifoda matnni qayta ishlash vazifalarini soddalashtirish va dastur kodini o'nlab va yuzlab qatorlarga qisqartirish imkonini beradi. Busiz ko'p muammolarni hal qilib bo'lmaydi.

PHPda oddiy ifodalar

PHP tilida oddiy iboralar bilan ishlashning uchta mexanizmi mavjud - “ereg”, “mb_ereg” va “preg”. Eng keng tarqalgani "preg" interfeysi bo'lib, uning funktsiyalari dastlab PHP tarkibiga kiritilgan Perl tili uchun ishlab chiqilgan PCRE muntazam ifoda kutubxonasiga kirishni ta'minlaydi. Preg funktsiyalari ma'lum bir matn satrida muntazam ifoda tilida ma'lum bir naqsh bo'yicha mosliklarni qidiradi.

Sintaksis asoslari

Qisqa maqolada muntazam iboralarning butun sintaksisini batafsil tasvirlab bo'lmaydi; Biz ishlab chiquvchi uchun keng imkoniyatlarni ko'rsatish va kod misollarini tushunish uchun faqat asosiy elementlarni taqdim etamiz.

B rasmiy ravishda juda murakkab tarzda aniqlanadi, shuning uchun tavsifni soddalashtiraylik. Muntazam ifoda matn qatoridir. U ajratilgan naqsh va uni qanday qayta ishlashni ko'rsatuvchi modifikatordan iborat. Shablonlarga turli xil muqobil va takrorlarni kiritish mumkin.

Masalan, ifodada /\d(3)-\d(2)-\d(2)/m ajratuvchi bo'ladi «/» , keyin naqsh va belgi keladi "m" modifikator bo‘ladi.

Muntazam ifodalarning barcha kuchi metabelgilar yordamida kodlangan. Tilning asosiy meta-belgisi teskari chiziq - “\”. U o'zidan keyingi belgi turini teskari qiladi (ya'ni, oddiy belgi meta-belgiga aylanadi va aksincha). Yana bir muhim metabelgi - bu naqshning muqobil o'zgarishlarini ko'rsatadigan "|" chiziqli chiziq. Metabelgilarga ko'proq misollar:

PHP, muntazam ifodalarni qayta ishlashda, bo'shliqni alohida muhim belgi sifatida ko'rib chiqadi, shuning uchun ABCWHERE va ABCWHERE iboralari boshqacha.

Pastki naqshlar

PHPda oddiy pastki naqshlar qavslar bilan ajratiladi va ba'zan "pastki ifodalar" deb ataladi. Quyidagi funktsiyalarni bajaring:

    Alternativlarni ajratib ko'rsatish. Masalan, shablon issiqlik (bir narsa|qush|) so'zlarga mos keladi "issiqlik", "olov qushi" Va "qovurish". Va qavslarsiz bu faqat bo'sh satr, "qush" va "qovurish" bo'ladi.

    "Hayajonli" pastki naqsh. Bu shuni anglatadiki, agar pastki qator naqshda mos kelsa, natijada barcha mosliklar qaytariladi. Aniqlik uchun bir misol keltiramiz. Quyidagi muntazam ifoda berilgan: g'olib ((oltin|oltinlangan)(medal|kubok)) oladi - va mosliklarni topish uchun qator: "g'olib oltin medal oladi". Asl iboraga qo'shimcha ravishda, qidiruv natijasi qaytadi: "oltin medal", "medal", "oltin".

Takrorlash operatorlari (kvadrifikatorlar)

Muntazam iboralarni yozishda ko'pincha raqamlar va belgilarning takrorlanishini tahlil qilish kerak bo'ladi. Agar takrorlashlar juda ko'p bo'lmasa, bu muammo emas. Ammo ularning aniq sonini bilmaganimizda nima qilish kerak? Bunday holda siz maxsus metabelgilardan foydalanishingiz kerak.

Takrorlashlarni tavsiflash uchun to'rtburchaklar qo'llaniladi - miqdorni ko'rsatish uchun metasimbollar. To'rtburchaklar ikki xil bo'ladi:

  • umumiy, qavs ichiga olingan;
  • qisqartirilgan.

Umumiy kvantifikator elementning jingalak qavslarda ikki raqam bilan ifodalangan minimal va maksimal ruxsat etilgan takrorlanish sonini belgilaydi, masalan: x(2,5). Agar maksimal takroriy soni noma'lum bo'lsa, ikkinchi argument o'tkazib yuboriladi: x(2,).

Keraksiz sintaktik tartibsizliklarga yo'l qo'ymaslik uchun stenografiya kvantifikatorlari eng ko'p takrorlanadigan belgilarni ifodalaydi. Odatda uchta qisqartma ishlatiladi:

1. * - (0,) ga ekvivalent bo'lgan nol yoki undan ko'p takrorlash.

2. + - bir yoki bir nechta takrorlash, ya'ni ,).

3. ? - nol yoki faqat bitta takrorlash - (0,1).

Oddiy ifodalarga misollar

Muntazam iboralarni o'rganayotganlar uchun misollar eng yaxshi qo'llanmadir. Biz minimal kuch bilan keng imkoniyatlarini ko'rsatadigan bir nechtasini taqdim etamiz. Barcha dastur kodlari PHP ning 4.x va undan yuqori versiyalari bilan toʻliq mos keladi. Sintaksisni toʻliq tushunish va tilning barcha imkoniyatlaridan foydalanish uchun J.Fridlning sintaksis toʻliq muhokama qilingan va nafaqat PHP, balki Python, Perl, MySQL, Java, Ruby va C#.

Elektron pochta manzilining to'g'riligini tekshirish

Vazifa. Mehmondan elektron pochta manzilini so'raydigan Internet sahifasi mavjud. Oddiy ibora xabarlarni yuborishdan oldin qabul qilingan manzilning to'g'riligini tekshirishi kerak. Tekshiruv ko'rsatilgan pochta qutisi haqiqatda mavjudligini va xatlarni qabul qilishini kafolatlamaydi. Ammo bu noto'g'ri manzillarni o'chirishi mumkin.

Yechim. Har qanday dasturlash tilida bo'lgani kabi, PHP elektron pochta manzilini tekshirishning muntazam ifodalari bir necha usullar bilan amalga oshirilishi mumkin va ushbu maqoladagi misollar hamma narsa emas. Shuning uchun, har bir holatda biz dasturlashda hisobga olinishi kerak bo'lgan talablar ro'yxatini taqdim etamiz va aniq amalga oshirish butunlay ishlab chiquvchiga bog'liq.

Shunday qilib, elektron pochtaning haqiqiyligini tekshiradigan ifoda quyidagi shartlarni tekshirishi kerak:

  1. Manba satrida @ belgisining mavjudligi va bo'shliqlarning yo'qligi.
  2. Manzilning domen qismi, undan keyin @ belgisi, faqat domen nomlari uchun haqiqiy belgilarni o'z ichiga oladi. Xuddi shu narsa foydalanuvchi nomiga ham tegishli.
  3. Foydalanuvchi nomini tekshirishda siz apostrof kabi maxsus belgilarni izlashingiz kerak yoki bu belgilar potentsial xavfli va SQL in'ektsiyasi kabi hujumlarda ishlatilishi mumkin. Bunday manzillardan saqlaning.
  4. Foydalanuvchi nomlari faqat bitta nuqtaga ruxsat beradi, bu chiziqdagi birinchi yoki oxirgi belgi bo'lishi mumkin emas.
  5. Domen nomi kamida ikkita va oltitadan oshmasligi kerak.

Ushbu shartlarning barchasini hisobga olgan misolni quyidagi rasmda ko'rish mumkin.

URL manzillarning haqiqiyligini tekshirish

Vazifa. Berilgan matn qatori to'g'ri yoki yo'qligini tekshiring Yana bir bor, URL tekshiruvi muntazam ifodalarni turli usullar bilan amalga oshirish mumkin.

Yechim. Bizning oxirgi versiyamiz quyidagicha ko'rinadi:

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

Endi rasmdan foydalanib, uning tarkibiy qismlarini batafsil ko'rib chiqaylik.

Kredit karta raqamlarini tekshirish

Vazifa. Eng keng tarqalgan to'lov tizimlari uchun kiritilgan plastik karta raqamining to'g'riligini tekshirish kerak. Variant faqat kartalar uchun ko'rib chiqiladi

Yechim. Ifodani yaratishda siz kiritilgan raqamda bo'sh joy mavjudligini hisobga olishingiz kerak. O'qish va diktantni osonlashtirish uchun kartadagi raqamlar guruhlarga bo'lingan. Shuning uchun, odam raqamni shu tarzda (ya'ni, bo'shliqlar yordamida) kiritishga harakat qilishi tabiiydir.

Mumkin bo'lgan bo'shliqlar va defislarni hisobga oladigan universal iborani yozish raqamlardan tashqari barcha belgilarni oddiygina olib tashlashdan ko'ra qiyinroqdir. Shuning uchun, raqamlardan tashqari barcha belgilarni olib tashlaydigan ifodada /D meta-belgisidan foydalanish tavsiya etiladi.

Endi siz to'g'ridan-to'g'ri raqamni tekshirishga o'tishingiz mumkin. Barcha kredit karta kompaniyalari noyob raqam formatidan foydalanadilar. Misol bundan foydalanadi va mijoz kompaniya nomini kiritishi shart emas - bu raqam bilan belgilanadi. Visa kartalari har doim 4 dan boshlanadi va raqam uzunligi 13 yoki 16 raqamdan iborat. MasterCard 51-55 oralig'ida 16 raqam uzunligi bilan boshlanadi. Natijada biz quyidagi ifodani olamiz:

Buyurtmani qayta ishlashdan oldin siz Luhn algoritmi yordamida hisoblangan raqamning oxirgi raqamini qo'shimcha tekshirishingiz mumkin.

Telefon raqamlari tekshirilmoqda

Vazifa. Kiritilgan telefon raqamining to'g'riligini tekshirish.

Yechim. Statsionar va mobil telefon raqamlaridagi raqamlar soni mamlakatdan mamlakatga sezilarli darajada farq qiladi, shuning uchun oddiy iboralar yordamida telefon raqamining to'g'riligini universal tekshirish mumkin emas. Ammo xalqaro raqamlar qat'iy formatga ega va shablonlarni tekshirish uchun juda yaxshi. Bundan tashqari, tobora ko'proq milliy telefon operatorlari yagona standartga rioya qilishga harakat qilmoqdalar. Raqamning tuzilishi quyidagicha:

+CCC.NNNNNNNNNNxEEEE, Qayerda:

C - mamlakat kodi, 1-3 ta raqamdan iborat.

N - uzunligi 14 tagacha bo'lgan raqam.

E - ixtiyoriy kengaytma.

Plyus zarur element hisoblanadi va x belgisi faqat kengaytirish zarur bo'lganda mavjud.

Natijada, biz quyidagi ifodaga ega bo'lamiz:

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

Raqamlar oralig'i

Vazifa. Muayyan diapazondagi butun songa mos kelishingiz kerak. Bundan tashqari, oddiy iboralar faqat qiymatlar oralig'idagi raqamlarga mos kelishi kerak.

Yechim. Bu erda bir nechta eng keng tarqalgan holatlar uchun ba'zi ifodalar mavjud:

IP manzilni topish

Vazifa. Berilgan qator 000.000.000.000-255.255.255.255 oralig'ida IPv4 formatidagi haqiqiy IP manzil ekanligini aniqlashingiz kerak.

Yechim. PHP-dagi har qanday vazifada bo'lgani kabi, oddiy iboralar ham juda ko'p farqlarga ega. Masalan, bu:

Onlayn ifodani tekshirish

Muntazam iboralarni toʻgʻriligini tekshirish yangi dasturchilar uchun “muntazam” dasturlash tillaridan farq qiluvchi sintaksisning murakkabligi tufayli qiyin boʻlishi mumkin. Ushbu muammoni hal qilish uchun haqiqiy matnda yaratilgan shablonning to'g'riligini tekshirishni osonlashtiradigan ko'plab onlayn ifoda testerlari mavjud. Dasturchi tekshiriladigan ifoda va ma'lumotlarni kiritadi va bir zumda ishlov berish natijasini ko'radi. Odatda, eng keng tarqalgan dasturlash tillari uchun muntazam iboralar, misollar va amalga oshirish farqlari batafsil tavsiflangan ma'lumotnoma bo'limi mavjud.

Ammo onlayn xizmatlar natijalariga to'liq ishonish PHP-dan foydalanadigan barcha ishlab chiquvchilar uchun tavsiya etilmaydi. Shaxsan yozilgan va sinovdan o'tgan muntazam ifoda sizning mahoratingizni oshiradi va xatolarning yo'qligini kafolatlaydi.


PHP tilining juda kuchli va foydali xususiyatlaridan biri uning muntazam ifodalarni qo'llab-quvvatlashidir. Ko'pgina dasturchilar, ham yangi boshlanuvchilar, ham juda tajribalilar, muntazam ifoda tilining aniq murakkabligi va murakkabligidan qo'rqishadi. Lekin sizni ishontirib aytamanki, bunga arziydi. Muntazam iboralardan foydalanish matnlarni va zaif tuzilgan ma'lumotlarni qayta ishlash ishini sezilarli darajada osonlashtiradi.


Muntazam iboralar maxsus tilda yozilgan iboralardir. Xavotir olmang, tilni tushunish juda oson, sizga faqat tajriba va amaliyot kerak bo'ladi.


O'ylaymanki, sizda matn (masalan, Microsoft Word-da) mavjud bo'lganda va siz undan muhim narsani topishingiz kerak bo'lgan holatlarga bir necha bor duch kelgansiz. Agar siz aniq nimani qidirayotganingizni bilsangiz, hamma narsa oddiy: qidiruv dialogini chaqiring, qidiruv so'zini kiriting, tugmani bosing va voila - matn topildi.


Agar siz qidirayotgan ma'lumot turini oldindan bilsangiz nima qilasiz? Masalan, siz bir necha yuz varaqdan iborat hujjatdagi barcha elektron pochta manzillarini topish vazifasiga duch kelasiz. Ba'zilar hujjatni qo'lda ko'radi, ba'zilari qidiruvga itni (@) kiritadi va uni qidiradi. Qabul qilaman - ikkala variant ham g'alati, rahmatsiz ish.

Bu erda muntazam iboralar yordamga keladi. Ba'zi bir taxminlarga ko'ra, muntazam iboralarni matn ustiga qo'yilgan niqoblar yoki shablonlarga solishtirish mumkin: agar matn niqobga mos kelsa, bu kerakli bo'lakdir. Ammo muntazam iboralarning qo'llanilishini ko'rib chiqishdan oldin, biz ularning sintaksisi bilan tanishamiz.

Muntazam ibora ma'lum qonun va qoidalarga muvofiq tuzilgan matn qatoridir. Satr belgilar va belgilar guruhlari, metabelgilar, kvantifikatorlar va modifikatorlardan iborat.

Bunday holda, belgilar har qanday alifboning har qanday belgilarini anglatadi. Va nafaqat o'qilishi mumkin. Buni amalga oshirish uchun siz o'qilmaydigan belgini osongina kiritishingiz mumkin, shunchaki uning kodini o'n oltilik shaklda bilishingiz kerak; Masalan:

// o'qiladigan belgilar a E // o'qilmaydigan belgilar va kodlar \x41 - "A" harfi bilan bir xil \x09 - yorliq belgisi

Belgilar guruhi ketma-ket yozilgan bir nechta belgilar:

Oʻrtacha ACZms

Men sizning e'tiboringizni darhol qaratmoqchiman - muntazam iboralardagi "bo'shliq" ham muhim belgi hisoblanadi, shuning uchun iboralarni yozishda ehtiyot bo'ling. Misol uchun, bu belgilar guruhlari TURLI iboralardir:

ABC WHERE ABC WHERE

Tilning keyingi elementi meta-belgilardir. "Meta" prefiksi bu belgilar boshqa belgilar yoki ularning guruhlarini tavsiflashini bildiradi. Jadvalda muntazam ifoda tilining asosiy meta-belgilari tasvirlangan:

Maxsus belgilarni belgilash uchun meta-belgilar
() Qavslar. Ichki iboralarni belgilaydi.
| Tanlash meta-belgi
^ Satr metabelgisining boshlanishi
$ Qator oxiri metabelgisi
\n Satr tasmasi belgisi (oltilik kod 0x0A)
\r Karetaning qaytish belgisi (oltilik kod 0x0D)
\t Tab belgisi (oltilik kod 0x09)
\xhh 0xhh oʻn oltilik kodli belgi kiritilsa, masalan \x42 lotincha “B” harfini kiritadi.
Belgilar guruhlarini belgilash uchun meta-belgilar
. Nuqta. Har qanday xarakter.
\d Raqam (0-9)
\D Raqam emas (0-9 belgilardan tashqari har qanday belgi)
\s Bo'sh belgi (odatda bo'sh joy va yorliq)
\S Boʻsh boʻlmagan belgi (barchasi \s meta-belgisi bilan belgilangan belgilardan tashqari)
\w "Lug'at" belgisi (so'zlarda ishlatiladigan belgi. Odatda barcha harflar, barcha raqamlar va pastki chiziq ("_"))
\V \w meta-belgi bilan belgilangan belgilardan tashqari hammasi

Jadvalning ikkinchi yarmidagi metabelgilarni eslab qolish juda oson. "d" - raqam (raqam), "s" - belgi (belgi), "w" - so'z (so'z). Agar harf katta bo'lsa, guruh tavsifiga "YO'Q" ni qo'shishingiz kerak.

Masalan, “Qizil formada 1812, yashil formada esa 2009 raqamlari bor” matnini olaylik. Keling, eng oddiy oddiy iboralarga misollarni ko'rib chiqaylik:

\d\d\d\d - 1812 va 2009 raqamlarini topadi \D - barcha harflar, bo'shliqlar va tinish belgilari \s - matndagi barcha bo'shliqlarni topadi.

Ammo bizning misolimizdagi yilni to'rtta emas, balki ikki raqam bilan yozish mumkin, so'zlarda boshqa tuslanishlar bo'lishi mumkin va hokazo. Kvadrat qavslar yordamida ko'rsatilgan belgilarning kichik to'plamlari bu erda yordam berishi mumkin:

Har qanday raqamni bildiradi (\d bilan bir xil) - juft raqamni bildiradi - lotin alifbosining istalgan belgisini (har qanday holatda) yoki raqamni bildiradi.

Misol uchun, test satridagi \d\d\d ifodasi faqat 1812 ni topadi, lekin 2009 emas. Bu ibora "oxirgi soni 0,2,4,6 bo'lgan to'rtta raqamning barcha ketma-ketligini toping yoki" deb o'qilishi kerak. 8".

Bizda faqat miqdor va o'zgartiruvchilarni eslatib o'tish kerak.

Miqdor ko'rsatkichi belgi yoki belgilar guruhi necha marta paydo bo'lishi kerakligini aniqlaydigan maxsus konstruktsiyadir. Miqdor ko'rsatkichi "()" jingalak qavs ichida yoziladi. Ikki yozish formati mumkin: aniq va diapazon. Aniq formati quyidagicha yozilgan:

Bu erda X - oldingi belgi yoki guruh necha marta takrorlanishi kerak. Masalan, ifoda

Yozib olishning ikkinchi shakli diapazondir. sifatida qayd etilgan

(X, Y) // yoki (,Y) // yoki (X,)

bu erda X - minimal va Y - maksimal takrorlash soni. Masalan:

"ketma-ket yozilgan ikki-to'rtta raqam" deb o'qing. Agar chegaralardan biri ko'rsatilmagan bo'lsa, unda hech qanday cheklov qabul qilinmaydi. Masalan:

\w(3,) - uch yoki undan ortiq harf. \d(,5) - umuman raqamlar yo'q yoki bor, lekin beshdan ortiq emas.

Miqdor ko'rsatkichlari bitta belgi yoki guruhga nisbatan qo'llanilishi mumkin:

[A-Yaa-ya](1,3)

Ushbu qurilish matndan bir, ikki yoki uchta harfdan iborat barcha ruscha so'zlarni tanlaydi (masalan, "yoki", "yo'q", "men", "men boraman" va boshqalar).

Jingalak qavslarga qo'shimcha ravishda yana uchta kvantlovchi metabelgi mavjud: "*" (yulduzcha), "+" (ortiqcha) va "?" (savol). Ular talab qilinadigan takrorlashlarning minimal va maksimal soni oldindan noma'lum bo'lgan hollarda qo'llaniladi. Misol uchun, elektron pochta manzillarini qidirishda foydalanuvchi nomida nechta belgi ("it" dan oldin) va domen nomida ("it" dan keyin) qancha belgilar bo'lishini oldindan aytib bo'lmaydi.

"*" meta-belgisi "noldan yoki undan ortiq har qanday miqdor" deb o'qiladi, ya'ni. dizayn

ketma-ket harflarning istalgan sonini, shu jumladan ularning to'liq yo'qligini belgilaydi.

"+" belgisi yulduzchadan faqat kamida bitta belgi mavjudligini talab qilishi bilan farq qiladi. Bular. dizayn

bir yoki bir nechta raqam bilan har qanday raqamli ketma-ketlikka mos keladi.

Belgisi "?" bitta belgining yo'qligi yoki mavjudligiga mos keladi. Bular. dizayn

bir yoki ikkita raqam bilan har qanday raqamli ketma-ketlikka mos keladi.

Bu erda "*" va "+" antiifikatorlarining bunday xususiyatini eslatib o'tish kerak ochko'zlik. Gap shundaki, sukut bo'yicha bu belgilar mumkin bo'lgan eng uzun belgilar ketma-ketligiga mos keladi. Masalan, "onam ramkani yuvdi" qatori uchun ibora:

"mama soap ra" ni tanlaydi, bu biroz kutilmagan, chunki biz "ma" ni olishni kutgandik. Ushbu xatti-harakatni o'zgartirish uchun "?" metabelgisidan foydalaning. (so'roq belgisi) miqdor ko'rsatkichidan keyin darhol yoziladi. Bu miqdor belgilovchilarning "ishtahasini" cheklaydi, ularni eng uzun emas, balki birinchi o'yinni qaytarishga majbur qiladi. Endi oldingi misolni o'zgartiramiz:

va kerakli o'yinni oling "ma".

Tilning oxirgi elementi modifikatorlar. Modifikator - bu muntazam ifodalarni tahlil qilish uchun "tizim" parametrlarini belgilaydigan maxsus belgi. Faqat to'rtta bunday belgilar mavjud, ular alohida yoki bir vaqtning o'zida ishlatilishi mumkin:

i Katta-kichik harflarni sezmaydigan rejimni yoqadi, ya'ni. ifodadagi bosh va kichik harflar farq qilmaydi.
m Qidirilayotgan matnni bir nechta satrlardan iborat deb hisoblash kerakligini bildiradi. Odatiy bo'lib, oddiy ifoda mexanizmi matnni aslida nima bo'lishidan qat'i nazar, bitta satr sifatida ko'radi. Shunga ko'ra, "^" va "$" meta-belgilari butun matnning boshi va oxirini bildiradi. Agar ushbu modifikator ko'rsatilgan bo'lsa, ular mos ravishda matnning har bir satrining boshi va oxirini ko'rsatadi.
s Odatiy metabelgi "." o'z ta'rifida yangi qator belgisini o'z ichiga olmaydi. Bular. ko'p qatorli matn uchun /.+/ ifodasi kutilganidek butun matnni emas, faqat birinchi qatorni qaytaradi. Ushbu modifikatorni belgilash ushbu cheklovni olib tashlaydi.
U Sukut bo'yicha barcha miqdoriy meta-belgilarni "ochko'z emas" qiladi. Tilning ba'zi modifikatsiyalarida (xususan, PHPda) "U" o'rniga "g" belgisi qo'llaniladi, bu ma'noga ko'proq mos keladi ("g" inglizcha "ochko'z", "ochko'z" so'zining qisqartmasi. ).

Jadvalda muntazam iboralarning eng mashhur va kerakli namunalari keltirilgan. Ulardan ba'zilari siz uchun murakkab va noqulay bo'lib tuyulishi mumkin, ammo batafsil o'rganish bilan siz shubhasiz tushunasiz.

PHPda oddiy ifodalar.

PHPda muntazam iboralar bilan ishlash uchun maxsus funksiyalar mavjud bo'lib, ularning ro'yxati va qisqacha tavsifi jadvalda keltirilgan:

int preg_match (satr namunasi, satr mavzusi [, massiv mos keladi])

Funktsiya mavzu mazmuni naqsh namunasiga mos kelishini tekshiradi. Agar mosliklar topilsa 1 ni qaytaradi, aks holda 0 ni qaytaradi. Agar ixtiyoriy matchlar massivi parametrini belgilasangiz, funksiya bajarilganda unga bitta element kiritiladi - birinchi moslik topilgan.

"; print_r($found); ?>

int preg_match_all (satr namunasi, satr mavzusi, massiv mos keladi [, int tartibi])
Funktsiya avvalgisi bilan bir xil, yagona farqi shundaki, u butun matnni qidiradi va matches massivida topilgan HAMMA mosliklarni qaytaradi.
aralash preg_replace (aralash naqsh, aralash almashtirish, aralash mavzu [, int chegarasi])
Oldingi ikkala funksiya singari, preg_replace naqshga mos keladigan matn qismini qidiradi. Funktsiya barcha topilgan fragmentlarni parametrlarda ko'rsatilgan matn bilan almashtiradi.Tozalashdan oldin:\n$matn\n\n"; $text = preg_replace("/(\n \s(2,))/"," ",$matn); echo " Tozalashdan keyin:\n$text"; // maxsus belgilardan tozalangan matnni ko'rsatadi // va qo'shimcha bo'shliqlar?>
aralash preg_replace_callback (aralash naqsh, aralash qayta qo'ng'iroq, aralash mavzu [, int limiti])
Funktsiya avvalgisining kengaytirilgan versiyasidir. Asosiy farq shundaki, bu funktsiya parametrlarga matnni tahlil qiladigan va almashtirish matnini yaratadigan funktsiya nomini beradi.
preg_split massivi (satr namunasi, satr mavzusi [, int chegarasi [, int bayroqlari]])
Bu funksiya explode() va split() funksiyalariga o'xshaydi. Uning o'ziga xosligi shundaki, ajratuvchi turg'un qator emas, balki muntazam ifodadir. Funktsiya manba ma'lumotlarini elementlarga ajratadi va ularni chiqish massiviga joylashtiradi.
preg_grep massivi (satr namunasi, massiv kiritish)
Funktsiya massivlarda muntazam qidirish uchun mo'ljallangan. Qidiruv uchun shablon va kirish ma'lumotlari massivi ko'rsatiladi va faqat shablonga mos keladigan elementlardan iborat massiv qaytariladi.

Ko'rib chiqilgan funktsiyalar ro'yxati to'liq emas, ammo bu oddiy iboralar bilan ishlashni muvaffaqiyatli boshlash uchun etarli. Agar siz ushbu mavzuga qiziqsangiz, qo'shimcha adabiyotlarni o'qing (masalan, Fridlning "Oddiy iboralar" kitobi). Bundan tashqari, o'quv maqsadlari uchun men muntazam iboralarni sinab ko'rish uchun maxsus dasturlardan birini o'rnatishni tavsiya qilaman (masalan, "PCRE" yoki "RegEx Builder").

1,6 ming

Oddiy ifodalar (regex sifatida qisqartiriladi) qidiruv naqshlarini tashkil etuvchi belgilar ketma-ketligidir. Ular birinchi navbatda simlarni moslashtirish naqshlarida qo'llaniladi.

Qisqacha tarix

  • Hammasi 1940-1960-yillarda, ko'plab aqlli odamlar muntazam iboralar haqida gapirganda boshlangan;
  • 1970-yillar g/re/p;
  • 1980 yil Perl va Genri Spenser;
  • 1997 PCRE (Perl bilan mos keladigan muntazam ifodalar). Biz muntazam iboralar deb ataydigan iboralarning yuksalishi aynan shu paytdan boshlangan. PCRE deyarli har bir til uchun kutubxonalarni taqdim etadi.

PHPda muntazam ifodalardan umumiy foydalanish

PHP PCRE bilan ishlash uchun uchta asosiy funktsiyani o'z ichiga oladi - preg_match, preg_match_all va preg_replace.

Muvofiqlikni taqqoslash

Ifoda mos kelsa, 1, mos kelmasa 0, xatolik yuzaga kelsa, false qaytaradi:

int preg_match (string $pattern, string $subject [, massiv va$mavzular [, int $flags = 0 [, int $offset = 0 ]]])

Topilgan mosliklar sonini qaytaruvchi muntazam ifodaga misol:

int preg_match_all (string $pattern, string $subject [, massiv va$ mos keladi [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

O'zgartirish

Ifoda almashtirilgan satr yoki massivni qaytaradi ( $mavzuga asoslangan):

aralash preg_replace (aralash $naqsh, aralash $almashtirish, aralash $mavzu [, int $chegarasi = -1 [, int $count ]])

JavaScript-da oddiy iboralardan umumiy foydalanish

JavaScript-dagi oddiy iboralar PHP-dagi kabi deyarli bir xil ko'rinadi.

Muvofiqlikni taqqoslash

Mosliklar qatorini qaytaradi yoki moslik topilmasa null:

string.match(RegExp);

O'zgartirish

O'zgartirishlar kiritilgan satrni qaytaradigan muntazam ifoda:

string.replace(RegExp, almashtirish);

JavaScript-da muntazam ifodalarning xususiyatlari

  • Nuqta hech qachon yangi qatorga mos kelmaydi:
  • Muntazam ifoda orqali moslik va almashtirishni solishtirish usullari ularsiz ham xuddi shunday.

Muntazam ifoda qoliplarini tuzish tamoyillari

Keling, kod bazasida elektron pochta manzillarini topishimiz kerak bo'lgan misolni ko'rib chiqaylik. Bizning maqsadimiz:

Analog rozetkalar

Oddiy iboralar ikki turdagi belgilardan iborat:

  • maxsus belgilar: ? * + () () ^ $ / .
  • Harflar.

Kirish satrlarini murvat sifatida, shablonni esa ular uchun ulagichlar to'plami sifatida (tegishli tartibda) tasavvur qiling.

Maxsus belgilar

Muntazam iboralarni sinab ko'rishda siz maxsus belgilar qanday ishlashini bilishingiz kerak:

  • Teskari qiyshiq chiziq \ belgisi boshqa maxsus belgini muntazam ifodada almashtirishi mumkin:
  • Nuqta va w -.

Yangi qatorlardan tashqari barcha belgilarni moslang. Agar siz nuqta va faqat nuqta bilan muvofiqligini tekshirmoqchi bo'lsangiz - , harflar, raqamlar va pastki chiziq bilan muvofiqligini - w

  • Kvadrat qavslar.

Qavslar ichidagi belgilarni moslang. Diapazonlarni qo'llab-quvvatlaydi. Ba'zi misollar:
o - har qanday a, b yoki c mos keladi.
o bosh harflar.
o har qanday raqam.
o - Har qanday kichik yoki katta harflar alfavit belgilariga mos keladi.
Ixtiyoriymi? 0 yoki 1-ga mos keling.
Yulduzcha *.

Yulduzcha 0 yoki undan ortiq belgilarni bildiradi.

1 yoki undan ortiq belgilarni moslang.

Jingalak qavslar ().

Minimal va maksimal qiymatlar. Muntazam ifoda sintaksisiga ba'zi misollar:
o (1,) 1 dan kam emas.
o (1,3) 1 dan 3 gacha.
o (1,64) 1 dan 64 gacha.

Elektron pochta manzillari uchun muntazam ifoda olish uchun bularning barchasini qo'shamiz:

/+@+(.+)*/i


Bu PHP da shunday ko'rinadi:

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

Tasdiqlash uchun oddiy ifodadan foydalanish

Qiyinchilik: Kirish ma'lumotlari biz kutgan narsa ekanligiga ishonch hosil qiling. Maqsad 1: /[^w$.]/ 2-maqsad: /^(1,2)$/

Oddiy iboralar elementlarni topish uchun juda mos keladi, lekin siz aynan nimani qidirayotganingizni bilishingiz kerak.

Qachon tekshirish uchun muntazam ifodani ishlatmaslik kerak?

Ko'p holatlar PHP filter_var funksiyasi yordamida yaxshiroq ko'rib chiqiladi. Masalan, elektron pochta manzilini tekshirish PHP-ning o'rnatilgan filtrlari yordamida amalga oshirilishi kerak:

filter_var(" [elektron pochta himoyalangan]", FILTER_VALIDATE_EMAIL)

Oddiy iboralar yordamida tekshirish

Satr oxiridagi oddiy iboralar langarlardan foydalanadi:

^ - qator boshini bildiradi.
$ - qatorning oxirini ko'rsatadigan dollar belgisi.

agar (!preg_match("%^(1,2)$%", $_POST["obuna_chastotasi"])) ( $isError = rost; )

Cheklangan belgilar sinflari

[^abc] - a, b yoki c tashqari hamma narsa, shu jumladan yangi qatorlar.

Faqat harf-raqamli belgilar, tire, nuqta va pastki chiziqni kiritish imkonini beruvchi misol:

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

Qidiring va almashtiring

Topish va almashtirishni amalga oshirish uchun eng keng tarqalgan PCRE funktsiyalari preg_replace() va preg_replace_callback() dir. Ammo deyarli bir xil ishlarni bajaradigan preg_filter() va preg_replace_callback_array() ham mavjud. Esda tutingki, preg_replace_callback_array() funksiyasi PHP7-dan beri mavjud.

Ro'yxatdagi so'zlarni almashtiring

$subject = "Men olma iste'mol qilmoqchiman."; echo preg_replace("/olma|banana|apelsin/", "meva", $mavzu);

Natija

Men meva iste'mol qilmoqchiman.

Agar oddiy ifodaning pastki naqshlari bo'lsa ( qavs ichida), siz $N yoki N (qaerda N butun son >= 1), bu "backlink" deb ataladi.

Ikki raqamni qayta tartiblash

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

Natija

Sana formatini o'zgartirish

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

Natija

Tegdagi URL manzilini almashtirishning oddiy misoli

$subject = "Qo'shimcha maqolalar uchun https://php.earth/doc saytiga tashrif buyuring."; echo preg_replace("#(https?://([^s./]+(?:.[^s./]+)*[^s]*))#i", "$2", $subject) ;

Natija