PHP-də requlyar ifadələrin tamahkarlığının məhdudlaşdırılması
Requlyar ifadələr standart olaraq tamahkardır. Bu o deməkdir ki, onlar mümkün olan maksimum sayda simvolu tutur.
Gəlin bir nümunə ilə baxaq. Tutaq ki, bizim belə bir sətirimiz var:
<?php
$str = 'aeeex zzz x kkk';
?>
Tutaq ki, biz bu sətirdə alt sətri
'aeeex' aşağıdakı şablona görə tapmaq istəyirik: hərf
'a', sonra istənilən simvol bir və ya daha çox
dəfə, sonra hərf 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Biz gözləyirik ki, dəyişənə nəticədə
'! zzz x kkk' sətri yazılsın. Lakin,
belə olmur - dəyişənə
'! kkk' sətri düşür.
Bütün iş ondadır ki, bizim requlyar ifadəmiz
'a' hərfindən 'x' hərfinə qədər olan bütün
simvolları axtarır.
Lakin bizim sətirdə iki 'x' hərfi var.
Tamahkarlıq səbəbindən requlyar ifadə ən
son x-ə qədər axtarır, bununla da gözlədiyimizdən
fərqli bir nəticə əldə edir.
Əlbəttə ki, çox vaxt bu davranış bizim üçün lazımdır. Lakin xüsusi bu halda biz tamahkarlığı ləğv etmək və requlyar ifadəyə ilk x-ə qədər axtarmasını demək istərdik.
Tamahkarlığı məhdudlaşdırmaq üçün təkrar operatorundan sonra sual işarəsi qoymaq lazımdır:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Tamahkarlığı bütün təkrar operatorları üçün
məhdudlaşdırmaq olar, belə: *?, ??
və {}?.
Bir sətir verilib:
<?php
$str = 'aba accca azzza wwwwa';
?>
Kənarlarında 'a' hərfləri olan bütün sətirləri
tapan və onların hər birini '!' ilə əvəz edən
bir requlyar ifadə yazın.
a hərfləri arasında istənilən simvol ola bilər ('a' istisna olmaqla).