Regular Expressions. Dars 2

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 div
without 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