Regular Expressions. Dars 2
Mana anchadan beri yozilishi vada qilingan 2-darsga ham navbat yetib keldi. 1-darsga etibor bergan bo’lsangiz asosan ^,$,+,*,[] kabilarni ishlatish haqida aytib o’tilgan (agar o’qigan bo’lsangiz). Bu darsda ham bulardan vos kechmagan holda to’liqroq yozishga harakat qilaman.
Darsni boshlasam.
()-bu kavslar subpattern deyiladi. Chunki bu kavslarni qo’llanilgan qismi alohida index ko’rinishida matches parametrda (preg_match ning 3-parametri) qaytariladi.
Oddiy misol: Biror bir matnda boshi raqamdan boshlanadigan so’zlarning sonini alohida matnini alohida olishi bo’lsin.
$matches = array();
preg_match_all("@(d+)(w+)@i", "Hello 123salom 412544c php 4x", $matches);
print_r($matches);
Natija:
Array
(
[0] => Array
(
[0] => 123salom
[1] => 412544c
[2] => 4x
)
[1] => Array
(
[0] => 123
[1] => 412544
[2] => 4
)
[2] => Array
(
[0] => salom
[1] => c
[2] => x
)
)
zoh: preg_match_all preg_match ning bitta analog funksiyasi bo’lib farqi preg_march bittasini topsa, preg_match_all hammasini qidirab topib tugatadi va natichani $matches ga beradi. Agar misolimizda preg_march ni ishlatsak natija quyidagicha chiqardi:
Array
(
[0] => 123salom
[1] => 123
[2] => salom
)
@-belgisi huddi «/» belgisining vazifasini bajaradi. Birinchi darsda / ko’rinishida ishlatilgan. Bu holatda @ ishlatilgan. Qaysi birini ishlatish o’zingizga havola. Umuman olgandan pattern ichida / belgisi ishlatiladigan bo’lsa @ belgisini ishlatgan maqul.
Etibor bergan bo’lsangiz natijalar 0,1,2 indexlarda chiqib turibdi. Bunda 0-indexda umumiy natija, 1-da birinchi kavs ichidagi (sonlar), 2-da esa ikkinchi kavs ichidagi (matn) chiqqan.
Bu holatda bularni aniqlash ancha noqulay, ya’ni agar kavslar soni ko’payib ketsa qaysi indexda nima kelayotganligini aniqlash qiyinlashadi. Buning osonroq usuli quyidagicha:
$matches = array();
preg_match_all("@(?d+)(?w+)@i", "Hello 123salom 412544c php 4x", $matches);
print_r($matches);
Natija:
Array
(
[0] => Array
(
[0] => 123salom
[1] => 412544c
[2] => 4x
)
[son] => Array
(
[0] => 123
[1] => 412544
[2] => 4
)
[1] => Array
(
[0] => 123
[1] => 412544
[2] => 4
)
[matn] => Array
(
[0] => salom
[1] => c
[2] => x
)
[2] => Array
(
[0] => salom
[1] => c
[2] => x
)
)
Bu holatda esa natjalar «son», «matn» indexlarida ham chiqyapti.
|-belgisi YOKI manosini anglatadi.
Masalan: Matndan div, span, font, center HTML teglarni topib ajratib olish bo’lsin, ichidagi matnlari bilan.
$matches = array();
preg_match_all('@div|span|font|center)[^>]*>(.*)(1)>@i', "teg divwithout tegfont teg", $matches);
print_r($matches);
Natija:
Array
(
[0] => Array
(
[0] => teg div
[1] => font teg
)
[tegs] => Array
(
[0] => div
[1] => font
)
[1] => Array
(
[0] => div
[1] => font
)
[2] => Array
(
[0] => teg div
[1] => font teg
)
[3] => Array
(
[0] => div
[1] => font
)
)
Izoh: @…@i i-harfi, bu patternning parametrlaridi. Bunda i-katta, kichikligiga yani bosh harfdami yo’qmi solishtirib o’tirmaydi. Misolda agar i ni olib tashab kabi yozilsa bu natijaga kirmaydi.
1-(1 kabi yozilgan chunki, 1-darsda belgini ishlatish uchun kabi yoziladi deb aytib o’tganman) bo’lsa subpatternning natijasini bildiradi. Huddi $matches ning index qiymatiga qarab natijani olgan kabi. 2 bo’lsa ikkinchi kavsdagi natijalarni pattern ichiga joylashtiradi.
Agar
preg_match_all('@div|span|font|center)[^>]*>(.*)(div|span|font|center)>@i', ...);
kabi yozilsa «…» ko’rinishdagilar ham natijaga qo’shilib ketishi mumkin edi.
. (nuqta) — bu har qanday bitta belgini anglatadi. «.+» kabi yozilgani kamida bitta belgi (har qanday) va unda ko’p hohlagancha. «.*» bironta belgi bo’lishi mumkin yoki bo’lmasligi ham mumkin (hohlagancha uzunlikdagi).
Eski OpenNet.Uz saytidan.
Texnologiyalar
Regular Expressions. Dars 2