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("@(?<son>\d+)(?<matn>\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('@\<(?<tegs>div|span|font|center)[^>]*\>(.*)\</(\\1)\>@i', "<div>teg div</div>without teg<font color=\"red\">font teg</font>", $matches);
print_r($matches);


Natija:
Array
(
    [0] => Array
        (
            [0] => <div>teg div</div>
            [1] => <font color="red">font teg</font>
        )

    [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('@\<(?<tegs>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.

2 комментария

SardorDushamov
$matches = array();
preg_match_all("@<(?<tegs>div|span|font|center)[^>]*>(.*)</(\1)>@i", "<div>teg div</div>without teg<font color="red">font teg</font>", $matches);
print_r($matches);

negadir manda ishlamadi
Natija:
Array
(
    [0] => Array
        (
        )

    [tegs] => Array
        (
        )

    [1] => Array
        (
        )

    [2] => Array
        (
        )

    [3] => Array
        (
        )

)
0
shranet
Editorda \\ bittasi ko'rinmay qolibdi. Shunga preg_match_all('...',… ko'rinishida yozilsa ishlaydi.
0