Zátvorky v regulárnom výraze v PHP
Obsah zátvoriek je dostupný nielen v reťazci pre náhradu, ale aj v samotnom regulárnom výraze: my môžeme niečo vložiť do zátvorky a potom priamo v regulárnom výraze povedať, že tu musí stáť obsah tejto zátvorky.
Obsah zátvoriek je dostupný podľa ich čísel,
pred ktorými je spätné lomítko. Napríklad,
nultá zátvorka bude dostupná takto: \0,
prvá zátvorka takto - \1, druhá
- \2 a tak ďalej.
Som si istý, že všetko napísané vyšie je pre vás zatiaľ veľmi nejasné. To nie je prekvapujúce, pretože zátvorky - sú najmenej pochopiteľným miestom regulárnych výrazov. Poďme si to vysvetliť na príkladoch.
Príklad
Nech máme takýto reťazec:
<?php
$str = 'aa bb cd ef';
?>
Nájdime v ňom všetky miesta, na ktorých sú dve rovnaké písmená za sebou. Pre riešenie úlohy budeme hľadať ľubovoľné písmeno, vložiť ho do zátvorky a potom skontrolovať, či nasledujúcim symbolom je obsah tejto zátvorky:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Výsledkom do premennej sa zapíše nasledovné:
'! ! cd ef'
Príklad
Nech máme takýto reťazec:
<?php
$str = 'asxca buzxb csgd';
?>
Nájdime v ňom všetky slová, v ktorých sú rovnaké prvé a posledné písmená. Pre riešenie úlohy napíšeme nasledujúcu šablónu: písmeno, potom ešte jedno alebo viac písmen a potom také isté písmeno ako prvé:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Výsledkom do premennej sa zapíše nasledovné:
'! ! csgd'
Príklad
Namiesto \1 možno písať \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Príklad
Možno tiež písať \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Príklad
V zložených zátvorkách možno uvádzať záporné čísla. V tomto prípade sa zátvorky budú počítať od konca:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Praktické úlohy
Daný reťazec:
<?php
$str = 'aaa bbb ccc xyz';
?>
Nájdite všetky podreťazce, v ktorých sú tri rovnaké písmená za sebou.
Daný reťazec:
<?php
$str = 'a aa aaa abab bbbb';
?>
Nájdite všetky podreťazce, v ktorých sú dve a viac rovnakých písmen za sebou.
Daný reťazec:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Nájdite všetky podreťazce, v ktorých sú dve rovnaké slová za sebou.