Iemaušanās regulārajā izteiksmē PHP
Iemaušanās saturs ir pieejams ne tikai aizstāšanas virknē, bet arī pašā regulārajā izteiksmē: mēs varam kaut ko ievietot iemaušanās, un pēc tam tieši regulārajā izteiksmē norādīt, ka šeit jāatrodas šīs iemaušanās saturam.
Pieejamība pie iemaušanās satura notiek pēc to numuriem,
pirms kuriem ir apgriezts slīpsvītras simbols. Piemēram,
nulles iemaušanās būs pieejama šādi: \0,
pirmā iemaušanās šādi - \1, otrā
- \2 un tā tālāk.
Esmu pārliecināts, ka viss iepriekš rakstītais pagaidām ir diezgan neskaidrs jums. Tas nav pārsteidzoši, jo iemaušanās ir regulāro izteiksmju visnesaprotamākā vieta. Apskatīsim to ar piemēriem.
Piemērs
Pieņemsim, ka mums ir šāda virkne:
<?php
$str = 'aa bb cd ef';
?>
Mēģināsim atrast tajā visas vietas, kurās atrodas divi jebkuri vienādi burti pēc kārtas. Lai atrisinātu uzdevumu, mēs meklēsim jebkuru burtu, ievietosim to iemaušanās, un pēc tam pārbaudīsim, vai nākamais simbols ir šīs iemaušanās saturs:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Rezultātā mainīgajā tiks ierakstīts sekojošais:
'! ! cd ef'
Piemērs
Pieņemsim, ka mums ir šāda virkne:
<?php
$str = 'asxca buzxb csgd';
?>
Atradīsim tajā visus vārdus, kuros pirmais un pēdējais burts ir vienādi. Lai atrisinātu uzdevumu, uzrakstīsim šādu veidni: burts, pēc tam vēl viens vai vairāki burti, un pēc tam tāds pats burts kā pirmais:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Rezultātā mainīgajā tiks ierakstīts sekojošais:
'! ! csgd'
Piemērs
\1 vietā var rakstīt \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Piemērs
Var arī rakstīt \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Piemērs
Cirtainajās iekavās var norādīt negatīvus skaitļus. Šajā gadījumā iemaušanās tiks skaitītas no beigām:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Praktiskie uzdevumi
Dota virkne:
<?php
$str = 'aaa bbb ccc xyz';
?>
Atrodiet visas apakšvirknes, kurās ir trīs vienādi burti pēc kārtas.
Dota virkne:
<?php
$str = 'a aa aaa abab bbbb';
?>
Atrodiet visas apakšvirknes, kurās ir divi vai vairāki vienādi burti pēc kārtas.
Dota virkne:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Atrodiet visas apakšvirknes, kurās ir divi vienādi vārdi pēc kārtas.