Групи в регулярен израз в PHP

Съдържанието на групите е достъпно не само в низа за замяна, но и в самия регулярен израз: ние можем да поставим нещо в група, а след това директно в регулярния израз да кажем, че тук трябва да стои съдържанието на тази група.

Съдържанието на групите е достъпно по техните номера, пред които стои обратна наклонена черта. Например, нулевата група ще бъде достъпна ето така: \0, първата група ето така - \1, втората - \2 и така нататък.

Сигурен съм, че всичко написано по-горе все още е доста неясно за вас. Това не е изненадващо, тъй като групите - най-малко разбираното място в регулярните изрази. Нека да разберем с примери.

Пример

Нека имаме следния низ:

php<?php
  $str = 'aa bb cd ef';
?>

Нека намерим в него всички места, в които стоят две еднакви букви подред. За решаване на задачата ще търсим всяка буква, ще я поставяме в група, а след това ще проверяваме, дали следващият символ е съдържанието на тази група:

php<?php
  $res = preg_replace('#([a-z])\1#', '!', $str);
?>

В резултат в променливата ще се запише следното:

php'! ! cd ef'

Пример

Нека имаме следния низ:

php<?php
  $str = 'asxca buzxb csgd';
?>

Нека намерим в него всички думи, в които първата и последната буква са еднакви. За решаване на задачата ще напишем следния шаблон: буква, следвана от още една или повече букви, а след това същата буква като първата:

php<?php
  $res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>

В резултат в променливата ще се запише следното:

php'! ! csgd'

Пример

Вместо \1 може да се пише \g1:

php<?php
  $res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>

Пример

Може също така да се пише \g{1}:

php<?php
  $res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>

Пример

Във фигурните скоби могат да се указват отрицателни числа. В този случай групите ще се броят от края:

php<?php
  $res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>

Практически задачи

Задание 1

Даден е низ:

php<?php
  $str = 'aaa bbb ccc xyz';
?>

Намерете всички поднизове, в които има три еднакви букви подред.

Задание 2

Даден е низ:

php<?php
  $str = 'a aa aaa abab bbbb';
?>

Намерете всички поднизове, в които има две или повече еднакви букви подред.

Задание 3

Даден е низ:

php<?php
  $str = 'aaa aaa bbb bbb ccc ddd';
?>

Намерете всички поднизове, в които има две еднакви думи подред.