Regular Expressions. Dars 1

Regular Expressions. Dars 1

Sayt tuzayotgan paytim mani ko’p qiynaydigan narsa POST, GET da kelayotgan ma’lumotlarni filtrlash edi. Masalan login, password lar qo’yilgan belgilar kiritilganmi yo boshqa belgilar ham bormi? Shularni tekshirish uchun hamisha o’zim PHP da funksiya yozardim. Keyin Regular Expressions funksiyalari orqali shu muammoni oson hal qilish mumkin ekanligini tushundim va o’rganishni boshladim.
Shu o’rganganlarimni maqola ko’rinishda qoldirishga qaror qildim.


Umuman bu maqolada preg_* funksiyalarini ishlatish emas, bajariladigan ilovalarning qo’llanilishi haqida yozmoqchi edim. Bajariladigan ilovalar juda oddiy, bir qarashdan tushunarsiz bo’lishi mumkin, lekin uni o’qishni o’rganib olganingizdan keyin juda oddiy bo’lib qoladi. Bunda asosan RG ga qarab ketma-ket qidirish orqali amalga oshiriladi. Agar ilovada keltirilgan ketma-ketlik bilan, tekshirilayorgan so’z ketma-ketligi mos kelsa true, aks holda false.

Regular Expressions (RG) ning asosiy belgilari quyidagilardir:
^ — bu belgi qidirilayotgan so’zning boshidan boshlanishini bildiradi. Yani siz tekshirayotgan so’zning boshi ^ belgidan boshlangan shart (belgilar to’plami, belgi, qandaydir so’z) lardan iboratmi degan savolga javob beradi. Tekshirish sharti ^ dan keyin kelgan belgilar uzunligigacha so’zning boshidan boshlab tekshiradi.
Misol:

echo (preg_match("/^Hel/", "Hello World")) ? "True" : "False";

Misolda ko’rinib turibdiki «Hello World» so’zining boshlanishi «Hel» so’zidan boshlanadimi yoki yo’qmi.

$ — bu belgi ^ ning teskarisi, ya’ni so’zning oxirgi qismini tekshiradi. Bu belgi o’zidan oldin kelgan so’zlarni so’zning oxirgi belgilari bilan ustma-ust qo’yadi va solishtiradi.
Misol:

echo (preg_match("/orld$/", "Hello World")) ? "True" : "False";

Agar sizning yaxlit so’zning o’zini tekshirmoqchi bo’lsangiz ya’ni

echo ("Hello World" == "Hello World")) ? "True" : "False";

kabi shartni RG da bajarish uchun bir paytda ^ va $ belgilarini ishlatish kifoya.
Misol:

echo (preg_match("/^Hello World$/", "Hello World")) ? "True" : "False";

Misolda ko’rinib turibdiki, ^ belgidan keyin kelgan qismi so’zning uzunligiga teng so’z bilan boshlanishi kerak. $ belgida esa o’zidan oldin kelgan so’zlar uzunligi bilan tugashi kerak. Demak ikkalasi birikkani yaxlit so’zning o’ziga teng yok teng emasligini beradi.

Izoh:
PHP da preg_match($rg, $string) funksiyasi RG ni tekshirib beradi.Bunda
$rg — bajariladigan ilova
$string — tekshiriladigan so’z (tekst)

[] — bu katta kavslar biror bir belgilar, yoki harflar, raqamlar blokini o’z ichiga olishi mumkin. Agar kiritilayotgan belgi faqat kichkina lotin harflari bo’lsa [a-z], katta [A-Z], agar a da f gacha bo’lsa [a-f], sonlar bo’lsa [0-9], faqat qandaydir belgi bo’lsa [@#$] (faqat shu uchta belgi bo’lsa 1, aks holda 0).
Maslan agar 16 lik sanoq sistemasiga tegishli belgini kiritish kerak bo’lsa quyidagicha bo’ladi.
Misol:

echo (preg_match("/^[a-fA-F0-9]$/", "F")) ? "True" : "False";

Misolda faqat belgi kiritdik, agar shu belgini qidirish kerak bo’lsa, ^, $ belgilari olib tashlanadi. Agar so’zning oxigi qismi shu belgi bilan tugashi kerak bo’lsa ^, boshi shu belgi bilan boshlanishi kerak bo’lsa $ belgi olib tashlanadi.
Agar kiritayotgan so’zda bitta belgidan tashqari hamma belgilarni kirishi mumkin bo’lsa, unda RG da yana ^ belgisi yordamga keladi.
Masalan site url sida ‘ (apstrof) belgisidan boshqa hamma belgilarni kiritish mumkin degan shartni quyidagicha berasiz.
Misol:

echo (preg_match("/^[^']+$/", $site_url)) ? "True" : "False";

^ belgisi [] kavslarning ichida qo’llansa belgilar boshini emas, [] kavs ichida turgan belgilardan qolgan belgilar bo’lishi mumkinligini anglatadi.
Agar misolga etibor gergan bo’lsangiz + (plus) belgisini ishlatdim. Bu belgi kamida bitta yoki undan ko’p manosini beradi. Bunda oldingi misolda faqat kiritilayotgan belgini tekshirgandik [a-fA-F0-9] lardan iborat ekanligiga. Agar […]+ ko’rinishida bo’lsa, kiritilayotgan so’z ^, $ larga qarab so’zning boshi, oxiri yoki o’zi shu [] ichida keltirilgan belgilar to’plamidan boshlanishi, tugashi yoki shunlardan iborat bo’lishi mumkin.
Misol: Kiritilayotgan login faqat a-z, A-Z va sonlardan iborat bo’lsin:

echo (preg_match("/^[a-fA-F0-9]+$/", $login)) ? "True" : "False";

Lekin bu misolda loginning uzunligi kamida 1 ta bo’lsa bo’ldi, hohlagancha uzunlikda bo’lishi mumkin. Agar siz kiritilayotgan so’zning uzunligini belgilamoqchi bo’lsangiz quyidagi belgidan foydalanasiz:

Kalit so`zlar: regular expressions php — bulgi biror bir belgilar to’plamining shu belgilar dan qancha uzunlikda yoki, kamida va ko’pi bilan nechta ekanligini bildiradi. Qo’llanish usuli 2 xil:
1. son — son shu belgilan to’lami uzunligi
2. {son boshlab, son gacha} — belgilar to’plamining uzunligi kamida «boshlab» uzunligiga teng va «gacha» uzunligidan oshmasligi kerak.

Misol: Login uzunligi kamida 5 va uzog’i bilan 20 ta bo’lsin. Agar faqat 5 ga teng bo’lsa Kalit so`zlar: regular expressions php larning ichiga 5 yoziladi.

echo (preg_match("/^[a-fA-F0-9]{5,20}$/", $login)) ? "True" : "False";

Etibor bergan bo’lsangiz + belgisini olib tashladim, chunki + = {1, …} ning analogi hisoblanadi. Shu qatorda yana bitta savol tug’uladi. + belgisi bilan kamida bitta belgi va undan ko’p, Kalit so`zlar: regular expressions php orqali qandaydir oraqlini beramiz. Shunday vaziyatlar tug’iladiki bironta ham kiritilmasiligi mumkin, lekin tekshirish kerak, bunda siz + belgisi o’rniga * (yulduzcha) belgisini ishlatishingiz mumkin.

* — belgilar to’plamidagi belgilar bo’lishi mumkin, yoki bo’lmasligi ham mumkin. Umuamn {0, …} ning analogi.
Misol: Foydalanuvchining ismini kiritish zarurmas, lekin ismida «@$%^ belgilarini qo’llab bo’lmasin.

echo (preg_match('/^[^^@%$"]$/', $name)) ? "True" : "False";

? — bu belgi qo’llansa, bo’ladi yoki bo’lmasligi ham mumkin ma’nosini beradi. Bu o’zidan oldin kelgan belgi (lar to’plamini) bo’lishi ham, yoki ular bo’lmasligi ham mumkinligini tekshiradi.
Misol: Site urlsi http:// yoki https:// lardan boshlanishi mumkin, shuni tekshiradigan.

echo (preg_match('/^https?:///', $url)) ? "True" : "False";

Yana bitta misol: O’zgaruvchilar lotin harflari bilan boshlanishi mumkin, lekin raqamlar ham qatnashishi mumkin. Shuni tekshiradigan quyidagicha bo’ladi.

echo (preg_match("/^[a-zA-Z]+[0-9]*/", $var)) ? "True" : "False";

Izoh:
belgisi maxsus belgilar bilan oddiy belgilarni ajratish uchun ishlatiladi. Agar belgining o’zini chiqarish kerak bo’lsa kabi qo’llaniladi.

Shuning bilan 1-darsimiz tugadi.
2-darsda () kavslarning ishlatirilishi, |,. (nuqta) haqida yoziladi. Umuman Bu yerda yozilmaganlari yoziladi.

Eski OpenNet.Uz saytidan.

Texnologiyalar
Regular Expressions. Dars 1