Capturing Groups in Reguliere Expressies in PHP
De inhoud van capturing groups is niet alleen beschikbaar in de vervangingsreeks, maar ook in de reguliere expressie zelf: we kunnen iets in een capturing group plaatsen, en dan direct in de reguliere expressie zeggen dat hier de inhoud van die capturing group moet staan.
De inhoud van capturing groups is beschikbaar via hun nummers,
voorafgegaan door een backslash. Bijvoorbeeld,
de nulde capturing group is zo beschikbaar: \0,
de eerste capturing group zo - \1, de tweede
- \2, enzovoort.
Ik ben er zeker van dat alles wat hierboven geschreven staat voor jou nogal duister is. Dat is niet verwonderlijk, aangezien capturing groups de minst begrepen plek zijn van reguliere expressies. Laten we het uitzoeken met voorbeelden.
Voorbeeld
Stel we hebben de volgende string:
<?php
$str = 'aa bb cd ef';
?>
Laten we er alle plekken in vinden waar twee willekeurige identieke letters achter elkaar staan. Om de taak op te lossen, zoeken we naar een willekeurige letter, plaatsen deze in een capturing group, en controleren dan of het volgende symbool de inhoud van deze capturing group is:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Het resultaat in de variabele zal zijn:
'! ! cd ef'
Voorbeeld
Stel we hebben de volgende string:
<?php
$str = 'asxca buzxb csgd';
?>
Laten we er alle woorden in vinden waar de eerste en de laatste letter identiek zijn. Om de taak op te lossen schrijven we het volgende patroon: letter, dan nog een of meer letters, en dan dezelfde letter als de eerste:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Het resultaat in de variabele zal zijn:
'! ! csgd'
Voorbeeld
In plaats van \1 kan men \g1 schrijven:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Voorbeeld
Men kan ook \g{1} schrijven:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Voorbeeld
In accolades kunnen negatieve getallen worden opgegeven. In dit geval worden de capturing groups vanaf het einde geteld:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Praktische opdrachten
Gegeven een string:
<?php
$str = 'aaa bbb ccc xyz';
?>
Vind alle substrings waarin drie identieke letters achter elkaar staan.
Gegeven een string:
<?php
$str = 'a aa aaa abab bbbb';
?>
Vind alle substrings waarin twee of meer identieke letters achter elkaar staan.
Gegeven een string:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Vind alle substrings waarin twee identieke woorden achter elkaar staan.