Групи в регулярен израз в PHP
Съдържанието на групите е достъпно не само в низа за замяна, но и в самия регулярен израз: ние можем да поставим нещо в група, а след това директно в регулярния израз да кажем, че тук трябва да стои съдържанието на тази група.
Съдържанието на групите е достъпно по техните номера,
пред които стои обратна наклонена черта. Например,
нулевата група ще бъде достъпна ето така: \0,
първата група ето така - \1, втората
- \2 и така нататък.
Сигурен съм, че всичко написано по-горе все още е доста неясно за вас. Това не е изненадващо, тъй като групите - най-малко разбираното място в регулярните изрази. Нека да разберем с примери.
Пример
Нека имаме следния низ:
<?php
$str = 'aa bb cd ef';
?>
Нека намерим в него всички места, в които стоят две еднакви букви подред. За решаване на задачата ще търсим всяка буква, ще я поставяме в група, а след това ще проверяваме, дали следващият символ е съдържанието на тази група:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
В резултат в променливата ще се запише следното:
'! ! cd ef'
Пример
Нека имаме следния низ:
<?php
$str = 'asxca buzxb csgd';
?>
Нека намерим в него всички думи, в които първата и последната буква са еднакви. За решаване на задачата ще напишем следния шаблон: буква, следвана от още една или повече букви, а след това същата буква като първата:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
В резултат в променливата ще се запише следното:
'! ! csgd'
Пример
Вместо \1 може да се пише \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Пример
Може също така да се пише \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Пример
Във фигурните скоби могат да се указват отрицателни числа. В този случай групите ще се броят от края:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Практически задачи
Даден е низ:
<?php
$str = 'aaa bbb ccc xyz';
?>
Намерете всички поднизове, в които има три еднакви букви подред.
Даден е низ:
<?php
$str = 'a aa aaa abab bbbb';
?>
Намерете всички поднизове, в които има две или повече еднакви букви подред.
Даден е низ:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Намерете всички поднизове, в които има две еднакви думи подред.