PHP'теги регулярдуу иштебестин тамашалыгын чектөө
Регулярдуу иштебестер демейки абалда тамаша болот. Бул алар максималдуу мүмкүн болгон символдорду туткалап алат дегенди билдирет.
Келгиле, мисал менен көрөлү. Бизде төмөнкүдөй сап бар дейли:
<?php
$str = 'aeeex zzz x kkk';
?>
Бул саптан биз 'aeeex' подсабын төмөнкүдөй үлгү боюнча тапкыбыз келет: 'a' тамгасы, андан кийин каалаган бир же бир нече символ, андан кийин 'x' тамгасы.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Биз күткөндөй, натыйжада өзгөрмөгө '! zzz x kkk' сабы жазылышы керек эле. Бирок, бул андай эмес - өзгөрмөгө '! kkk' сабы түшөт.
Маселенин баары, биздин регулярка 'a' тамгасынан 'x' тамгасына чейинки бардык символдорду издеп жатат.
Бирок биздин сапта эки 'x' тамгасы бар. Тамашалыктын натыйжасында, регулярка акыркы 'x' тамгасына чейин издеп, биз күткөндүгүбүздү эмес, башка нерсени туткалап алып жатат.
Албетте, көбүнчө мындай аракет бизге керек болот. Бирок, так ушул учурда биз тамашалыкты жокко чыгарып, регуляркага биринчи 'x' табылганга чейин издешин айткыбыз келет.
Тамашалыкты чектөө үчүн, кайталоо операторунун артына суроо белгисин коюу керек:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Тамашалыкты бардык кайталоо операторлоруна чектөөгө болот, мындай: *?, ?? жана {}?.
Сап берилген:
<?php
$str = 'aba accca azzza wwwwa';
?>
Чегинде 'a' тамгалары турган бардык саптарды таба турган жана ар биринин ордуна '!' коюучу регуляр жазыңыз. 'a' тамгаларынын ортосунда каалаган символ ('a' тамгасынан башка) болушу мүмкүн.