Zajeti delci v regularnem izrazu v PHP
Vsebina zajetih delcev ni na voljo le v nadomestnem nizu, temveč tudi v samem regularnem izrazu: mi lahko nekaj damo v zajeti delec, nato kar v regularnem izrazu rečemo, da mora tukaj stati vsebina tega zajetega delca.
Vsebina zajetih delcev je na voljo po njihovih številkah,
pred katerimi je obratna poševnica. Na primer,
ničti zajeti delec bo na voljo takole: \0,
prvi zajeti delec takole - \1, drugi
- \2 in tako naprej.
Prepričan sem, da je vse zgoraj napisano za vas za zdaj še precej nejasno. To ni presenetljivo, saj so zajeti delci - najbolj nerazumljivo mesto v regularnih izrazih. Razumejmo s primeri.
Primer
Recimo, da imamo takšen niz:
<?php
$str = 'aa bb cd ef';
?>
Poiščimo v njem vsa mesta, kjer stoji dve katerikoli enaki črki zapored. Za rešitev problema bomo iskali katerokoli črko, jo dali v zajeti delec, nato pa preverili, ali gre za naslednjim simbolom vsebina tega zajetega delca:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Kot rezultat se bo v spremenljivko zapisalo naslednje:
'! ! cd ef'
Primer
Recimo, da imamo takšen niz:
<?php
$str = 'asxca buzxb csgd';
?>
Poiščimo v njem vse besede, v katerih so enake prva in zadnja črka. Za rešitev problema napišimo naslednji vzorec: črka, nato še ena ali več črk, in nato enaka črka kot prva:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Kot rezultat se bo v spremenljivko zapisalo naslednje:
'! ! csgd'
Primer
Namesto \1 lahko pišemo \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Primer
Lahko pišemo tudi \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Primer
V zavite oklepaje lahko pišemo negativna števila. V tem primeru bodo zajeti delci šteti od konca:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Praktične naloge
Dan je niz:
<?php
$str = 'aaa bbb ccc xyz';
?>
Poiščite vse podnize, v katerih so tri enake črke zapored.
Dan je niz:
<?php
$str = 'a aa aaa abab bbbb';
?>
Poiščite vse podnize, v katerih so dve ali več enakih črk zapored.
Dan je niz:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Poiščite vse podnize, v katerih so dve enaki besedi zapored.