Įdėtos išraiškos reguliariojoje išraiškoje PHP
Įdėtų išraiškų turinys prieinamas ne tik pakeitimo eilutėje, bet ir pačioje reguliariojoje išraiškoje: mes galime įdėti ką nors į įdėtą išraišką, o tada tiesiog reguliariojoje išraiškoje nurodyti, kad čia turi būti tos įdėtos išraiškos turinys.
Įdėtų išraiškų turinys prieinamas pagal jų numerius,
prieš kuriuos rašomas atvirkštinis pasvirasis brūkšnys. Pavyzdžiui,
nulinė įdėta išraiška bus prieinama taip: \0,
pirmoji įdėta išraiška taip - \1, antroji
- \2 ir taip toliau.
Esu tikras, kad viskas, kas parašyta aukščiau, kol kas yra gana neaišku jums. Tai nenuostabu, nes įdėtos išraiškos yra pati sunkiausiai suprantama reguliariųjų išraiškų vieta. Naglindinkime pavyzdžiais.
Pavyzdys
Tarkime, kad turime tokią eilutę:
<?php
$str = 'aa bb cd ef';
?>
Raskime joje visas vietas, kuriose yra dvi bet kokios vienodos raidės iš eilės. Užduočiai išspręsti ieškosime bet kokios raidės, padėsime ją į įdėtą išraišką, o tada patikrinsime, ar sekantis simbolis yra tos įdėtos išraiškos turinys:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Rezultate į kintamąjį bus įrašyta tai:
'! ! cd ef'
Pavyzdys
Tarkime, kad turime tokią eilutę:
<?php
$str = 'asxca buzxb csgd';
?>
Raskime joje visus žodžius, kurių pirmoji ir paskutinė raidės yra vienodos. Užduočiai išspręsti parašysime tokį šabloną: raidė, po to dar viena ar daugiau raidžių, o po to tokia pati raidė kaip ir pirmoji:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Rezultate į kintamąjį bus įrašyta tai:
'! ! csgd'
Pavyzdys
Vietoj \1 galima rašyti \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Pavyzdys
Taip pat galima rašyti \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Pavyzdys
Garbanotuosiuose skliaustuose galima nurodyti neigiamus skaičius. Tokiu atveju įdėtos išraiškos bus skaičiuojamos nuo galo:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Praktinės užduotys
Duota eilutė:
<?php
$str = 'aaa bbb ccc xyz';
?>
Raskite visus poeilutes, kuriuose yra trys vienodos raidės iš eilės.
Duota eilutė:
<?php
$str = 'a aa aaa abab bbbb';
?>
Raskite visus poeilutes, kuriuose yra dvi ar daugiau vienodų raidžių iš eilės.
Duota eilutė:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Raskite visus poeilutes, kuriuose yra du vienodi žodžiai iš eilės.