Grupy przechwytujące w wyrażeniach regularnych w PHP
Zawartość grup przechwytujących jest dostępna nie tylko w łańcuchu zastępowania, ale także w samym wyrażeniu regularnym: możemy coś umieścić w grupie, a następnie bezpośrednio w wyrażeniu regularnym powiedzieć, że w tym miejscu powinna znajdować się zawartość tej grupy.
Zawartość grup przechwytujących jest dostępna za pomocą ich numerów,
przed którymi stoi odwrócony ukośnik. Na przykład,
grupa zerowa będzie dostępna w ten sposób: \0,
pierwsza grupa w ten sposób - \1, druga
- \2 i tak dalej.
Jestem pewien, że wszystko, co napisano powyżej, jest na razie bardzo mgliste dla Ciebie. To nie dziwi, ponieważ grupy przechwytujące to najbardziej niezrozumiałe miejsce w wyrażeniach regularnych. Przejdźmy do przykładów.
Przykład
Załóżmy, że mamy taki łańcuch:
<?php
$str = 'aa bb cd ef';
?>
Znajdźmy w nim wszystkie miejsca, w których występują dwie dowolne, identyczne litery pod rząd. Aby rozwiązać zadanie, będziemy szukać dowolnej litery, umieszczać ją w grupie przechwytującej, a następnie sprawdzać, czy następnym symbolem jest zawartość tej grupy:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
W wyniku do zmiennej zapisze się następująca wartość:
'! ! cd ef'
Przykład
Załóżmy, że mamy taki łańcuch:
<?php
$str = 'asxca buzxb csgd';
?>
Znajdźmy w nim wszystkie słowa, w których pierwsza i ostatnia litera są identyczne. Aby rozwiązać zadanie, napiszemy następujący wzorzec: litera, następnie jedna lub więcej liter, a następnie taka sama litera jak pierwsza:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
W wyniku do zmiennej zapisze się następująca wartość:
'! ! csgd'
Przykład
Zamiast \1 można pisać \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Przykład
Można również pisać \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Przykład
W nawiasach klamrowych można podawać liczby ujemne. W tym przypadku grupy będą liczone od końca:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Zadania praktyczne
Dany jest łańcuch:
<?php
$str = 'aaa bbb ccc xyz';
?>
Znajdź wszystkie podłańcuchy, w których występują trzy identyczne litery pod rząd.
Dany jest łańcuch:
<?php
$str = 'a aa aaa abab bbbb';
?>
Znajdź wszystkie podłańcuchy, w których występują dwie lub więcej identycznych liter pod rząd.
Dany jest łańcuch:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Znajdź wszystkie podłańcuchy, w których występują dwa identyczne słowa pod rząd.