Závorky v regulárních výrazech v PHP
Obsah zachycených skupin (závorek) je dostupný nejen v řetězci pro nahrazení, ale i v samotném regulárním výrazu: my můžeme něco uložit do skupiny a potom přímo v regulárním výrazu říct, že zde musí stát obsah této skupiny.
Obsah zachycených skupin je dostupný podle jejich čísel,
před kterými stojí zpětné lomítko. Například,
nultá skupina bude dostupná takto: \0,
první skupina takto - \1, druhá
- \2 a tak dále.
Jsem si jistý, že vše výše napsané je pro vás zatím velmi nejasné. To není překvapivé, protože zachycené skupiny jsou nejhůře pochopitelným místem regulárních výrazů. Pojďme si to vysvětlit na příkladech.
Příklad
Předpokládejme, že máme takovýto řetězec:
<?php
$str = 'aa bb cd ef';
?>
Pojďme v něm najít všechna místa, ve kterých jsou dvě stejné písmena za sebou. K řešení úlohy budeme hledat libovolné písmeno, uložit jej do skupiny a poté zkontrolovat, zda následujícím symbolem je obsah této skupiny:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Výsledek v proměnné bude následující:
'! ! cd ef'
Příklad
Předpokládejme, že máme takovýto řetězec:
<?php
$str = 'asxca buzxb csgd';
?>
Pojďme v něm najít všechna slova, ve kterých je první a poslední písmeno stejné. K řešení úlohy napíšeme následující vzor: písmeno, poté jedno nebo více písmen a poté stejné písmeno jako první:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Výsledek v proměnné bude následující:
'! ! csgd'
Příklad
Místo \1 lze psát \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Příklad
Lze také psát \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Příklad
Ve složených závorkách lze uvádět záporná čísla. V tomto případě se skupiny budou počítat od konce:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Praktické úlohy
Je dán řetězec:
<?php
$str = 'aaa bbb ccc xyz';
?>
Najděte všechny podřetězce, ve kterých jsou tři stejná písmena za sebou.
Je dán řetězec:
<?php
$str = 'a aa aaa abab bbbb';
?>
Najděte všechny podřetězce, ve kterých jsou dvě a více stejných písmen za sebou.
Je dán řetězec:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Najděte všechny podřetězce, ve kterých jsou dvě stejná slova za sebou.