Регулярные выражения по умолчанию жадные. Это значит, что они захватывают максимальное возможное количество символов.
Давайте разберем на примере. Пусть у нас есть вот такая строка:
<?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'
).