PHP-dä regulýar ifadeleriň açgözligini çäklendirmek
Regulýar ifadeler deslapky ýagdaýynda açgöz bolýar. Bu onuň mümkün bolan iň köp nyşany tutýandygyny aňladýar.
Geliň bir mysal bilen düşüneli. Bizde şeýle bir setir bolsun:
<?php
$str = 'aeeex zzz x kkk';
?>
Biz bu setirde 'aeeex' setir bölegini şu şablona görä
tapmak isleýäris: 'a' harp, soňra islendik nyşan bir ýa-da birnäçe gezek,
soňra 'x' harp.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Biz netijede üýtgeýjiniň içine '! zzz x kkk' setiriniň
ýazylajakdygyna garaşýarys. Ýöne, bu ýerde özgerýär - üýtgeýjiniň içine
'! kkk' setiri düşýär.
Mesele şonda, bizim regulýarka 'a' harpyndan 'x'
harpa çenli ähli nyşanlary gözleýär. Ýöne bizim setirimizde iki sany
'x' harp bar. Açgözlik sebäpli regulýarka iň soňky 'x'-e çenli
gözleýär, şeýlelikde biz garaşanymyzdan başga zat tutýar.
Elbetde, köplenç bu hereket bize gerek bolýar. Ýöne, ýörite bu ýagdaýda biz açgözligi ýatyryp, regulýarkanyň ilkinji 'x'-i tapmagyny aýtmak isleýäris.
Açgözligi çäklendirmek üçin gaýtalanma operatoryndan soň sorag belgisini goýmaly:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Açgözligi ähli gaýtalanma operatorlary üçin çäklendirip bolýar, şeýle: *?, ??
we {}?.
Setir berlen:
<?php
$str = 'aba accca azzza wwwwa';
?>
Her bir gyrasynda 'a' harplary duran ähli setirleri tapýan
regulýar ifadäni ýazyň we olaryň her birini '!' bilen çalyşyň.
a harplarynyň arasynda islendik nyşan ('a' başga) bolup biler.