Абмежаванне прагнасці ў рэгулярках у PHP
Рэгулярныя выразы па змаўчанні прагныя. Гэта значыць, што яны захопліваюць максімальна магчымая колькасць сімвалаў.
Давайце разбярэм на прыкладзе. Хай у нас ёсць вось такая радок:
<?php
$str = 'aeeex zzz x kkk';
?>
Хай мы ў гэтай радку хочам знайсці падрадок
'aeeex' па наступным шаблоне: літара
'a', затым любы сімвал адзін ці больш
раз, затым літара 'x'.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
Мы чакаем, што ў зменную ў выніку
запішацца радок '! zzz x kkk'. Аднак,
гэта не так - у зменную трапляе радок
'! kkk'.
Уся справа ў тым, што наша рэгулярка шукае ўсе
сімвалы ад літары 'a' да літары 'x'.
Але ў нашай радку дзве літары 'x'. З-за
прагнасці атрымліваецца, што рэгулярка шукае да
самага апошняга ікса, тым самым захопліваючы
не тое, што мы чакалі.
Вядома, часта такая паводзіны нам і трэба. Але канкрэтна ў гэтым выпадку мы б хацелі адмяніць прагнасць і сказаць рэгулярцы, каб яна шукала да першага ікса.
Каб абмежаваць прагнасць, трэба пасля аператара паўтарэння паставіць знак пытання:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
Прагнасць можна абмяжоўваць усём аператарам
паўтарэння, вось так: *?, ??
і {}?.
Дадзена радок:
<?php
$str = 'aba accca azzza wwwwa';
?>
Напішыце рэгулярку, якая знойдзе ўсе радкі
па краях якіх стаяць літары 'a',
і замяніць кожную з іх на '!'. Паміж
літарамі a можа быць любы сімвал (акрамя
'a').