Кишэні ў рэгулярным выразе ў PHP
Змесціва кішэняў даступна не толькі ў радку замены, але і ў самой рэгулярцы: мы можам пакласці што-небудзь у кішэнь, а затым проста ў рэгулярцы сказаць, што тут павінна стаяць змесціва гэтага кішэня.
Змесціва кішэняў даступна па іх нумарах,
перад якімі стаіць зваротны слэш. Напрыклад,
нулявы кішэнь будзе даступны вось так: \0,
першы кішэнь вось так - \1, другі
- \2 і гэтак далей.
Упэўнены, што ўсё напісанае вышэй пакуль вельмі туманна для вас. Гэта не дзіўна, так якія кішэні - самае незразумелае месца рэгулярак. Давайце будзем разбірацца на прыкладах.
Прыклад
Хай у нас ёсць вось такая радок:
<?php
$str = 'aa bb cd ef';
?>
Давайце знойдзем у ёй усе месцы, у якіх стаяць дзве любыя аднолькавыя літары запар. Для вырашэння задачы будзем шукаць любую літару, кладзім яе ў кішэнь, а затым правяраць, ці ідзе наступным сімвалам змесціва гэтага кішэня:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
У выніку ў зменную запішацца наступнае:
'! ! cd ef'
Прыклад
Хай у нас ёсць вось такая радок:
<?php
$str = 'asxca buzxb csgd';
?>
Давайце знойдзем у ёй усе словы, у якіх аднолькавыя першая і апошняя літары. Для вырашэння задачы напішам наступны шаблон: літара, затым яшчэ адна ці больш літар, а затым такая жа літара як першая:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
У выніку ў зменную запішацца наступнае:
'! ! csgd'
Прыклад
Замест \1 можна пісаць \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Прыклад
Можна таксама пісаць \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Прыклад
У фігурных дужках можна паказваць адмоўныя лікі. У гэтым выпадку кішэні будуць адлічвацца з канца:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Практычныя задачы
Дадзена радок:
<?php
$str = 'aaa bbb ccc xyz';
?>
Знайдзіце ўсе падрадкі, у якіх ёсць тры аднолькавыя літары запар.
Дадзена радок:
<?php
$str = 'a aa aaa abab bbbb';
?>
Знайдзіце ўсе падрадкі, у якіх ёсць дзве ці больш аднолькавыя літары запар.
Дадзена радок:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Знайдзіте ўсе падрадкі, у якіх ёсць два аднолькавыя словы запар.