Džepovi u regularnim izrazima u PHP-u
Sadržaj džepova nije dostupan samo u zamenskom stringu, već i u samom regularnom izrazu: mi možemo da stavimo nešto u džep, a zatim direktno u regularnom izrazu da kažemo da ovde treba da stoji sadržaj tog džepa.
Sadržaj džepova je dostupan preko njihovih brojeva,
ispred kojih stoji obrnuta kosa crta. Na primer,
nulti džep će biti dostupan ovako: \0,
prvi džep ovako - \1, drugi
- \2 i tako dalje.
Uveren sam da je sve gore napisano za sada veoma mutno za vas. To nije iznenađujuće, pošto su džepovi najnerazumljiviji deo regularnih izraza. Hajde da se razjašnjavamo na primerima.
Primer
Neka imamo ovakav string:
<?php
$str = 'aa bb cd ef';
?>
Hajde da pronađemo u njemu sva mesta, u kojima stoje dva ista slova jedno za drugim. Za rešavanje zadatka ćemo tražiti bilo koje slovo, stavljati ga u džep, a zatim proveravati, da li kao sledeći simbol ide sadržaj tog džepa:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Kao rezultat u promenljivu će biti upisano sledeće:
'! ! cd ef'
Primer
Neka imamo ovakav string:
<?php
$str = 'asxca buzxb csgd';
?>
Hajde da pronađemo u njemu sve reči, u kojima su ista prvo i poslednje slovo. Za rešavanje zadatka napisaćemo sledeći šablon: slovo, zatim još jedno ili više slova, a zatim takvo isto slovo kao prvo:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Kao rezultat u promenljivu će biti upisano sledeće:
'! ! csgd'
Primer
Umesto \1 može se pisati \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Primer
Može se takođe pisati \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Primer
U vitičastim zagradama mogu se navoditi negativni brojevi. U ovom slučaju džepovi će se računati sa kraja:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Praktični zadaci
Dat je string:
<?php
$str = 'aaa bbb ccc xyz';
?>
Pronađite sve podstringove, u kojima ima tri ista slova jedno za drugim.
Dat je string:
<?php
$str = 'a aa aaa abab bbbb';
?>
Pronađite sve podstringove, u kojima ima dva ili više istih slova jedno za drugim.
Dat je string:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Pronađite sve podstringove, u kojima ima dva iste reči jedno za drugim.