Grupuri de captură în expresii regulate în PHP
Conținutul grupuri de captură este disponibil nu numai în sirul de înlocuire, ci și în expresia regulată însăși: noi putem pune ceva într-un grup de captură, apoi direct în expresia regulată să spunem că aici trebuie să fie conținutul acelui grup de captură.
Conținutul grupuri de captură este disponibil după numerele lor,
în fața cărora se află un backslash. De exemplu,
grupul de captură zero va fi accesat astfel: \0,
primul grup de captură astfel - \1, al doilea
- \2 și așa mai departe.
Sunt sigur că tot ce este scris mai sus este încă destul de neclar pentru tine. Acest lucru nu este surprinzător, deoarece grupuri de captură - este locul cel mai greu de înțeles al expresiilor regulate. Să înțelegem cu exemple.
Exemplu
Să presupunem că avem următorul sir:
<?php
$str = 'aa bb cd ef';
?>
Să găsim în el toate locurile în care se află două litere identice consecutive. Pentru a rezolva problema, vom căuta orice literă, o vom pune într-un grup de captură, apoi vom verifica dacă următorul simbol este conținutul acestui grup de captură:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Ca rezultat, în variabilă se va scrie următoarele:
'! ! cd ef'
Exemplu
Să presupunem că avem următorul sir:
<?php
$str = 'asxca buzxb csgd';
?>
Să găsim în el toate cuvintele în care prima și ultima literă sunt identice. Pentru a rezolva problema, vom scrie următorul șablon: literă, apoi încă una sau mai multe litere, iar apoi aceeași literă ca prima:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Ca rezultat, în variabilă se va scrie următoarele:
'! ! csgd'
Exemplu
În loc de \1 se poate scrie \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Exemplu
Se poate scrie și \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Exemplu
În acolade se pot indica numere negative. În acest caz, grupuri de captură vor fi numărate de la sfârșit:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Probleme practice
Este dat sirul:
<?php
$str = 'aaa bbb ccc xyz';
?>
Găsiți toate subșirurile în care există trei litere identice consecutive.
Este dat sirul:
<?php
$str = 'a aa aaa abab bbbb';
?>
Găsiți toate subșirurile în care există două sau mai multe litere identice consecutive.
Este dat sirul:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Găsiți toate subșirurile în care există două cuvinte identice consecutive.