Sulkumerkit PHP:n säännöllisissä lausekkeissa
Sulkumerkkien sisältö on saatavilla ei vain korvausmerkkijonossa, vaan myös itse säännöllisessä lausekkeessa: me voimme laittaa jotain sulkumerkkiin ja sitten suoraan säännöllisessä lausekkeessa sanoa, että tässä pitäisi olla tämän sulkumerkin sisältö.
Sulkumerkkien sisältö on saatavilla niiden numeroittain,
joiden edessä on käänteinen viiva. Esimerkiksi,
nollas sulkumerkki on saatavilla näin: \0,
ensimmäinen sulkumerkki näin - \1, toinen
- \2 ja niin edelleen.
Olen varma, että kaikki edellä kirjoitetut on toistaiseksi melko sumea sinulle. Se ei ole yllättävää, sillä sulkumerkit ovat säännöllisten lausekkeiden vaikein ymmärtää oleva osa. Opiskellaanpa esimerkkien avulla.
Esimerkki
Oletetaan, että meillä on tällainen merkkijono:
<?php
$str = 'aa bb cd ef';
?>
Etsitään siitä kaikki kohdat, joissa on kaksi mitä tahansa samoja kirjaimia peräkkäin. Ongelman ratkaisemiseksi etsimme mitä tahansa kirjainta, laitamme sen sulkumerkkiin ja sitten tarkistamme, tuleeko seuraavana merkkinä tämän sulkumerkin sisältö:
<?php
$res = preg_replace('#([a-z])\1#', '!', $str);
?>
Tuloksena muuttujaan kirjoitetaan seuraava:
'! ! cd ef'
Esimerkki
Oletetaan, että meillä on tällainen merkkijono:
<?php
$str = 'asxca buzxb csgd';
?>
Etsitään siitä kaikki sanat, joissa ensimmäinen ja viimeinen kirjain ovat samat. Ongelman ratkaisemiseksi kirjoitamme seuraavan mallin: kirjain, sitten yksi tai useampi kirjain, ja sitten sama kirjain kuin ensimmäinen:
<?php
$res = preg_replace('#([a-z])[a-z]+\1#', '!', $str);
?>
Tuloksena muuttujaan kirjoitetaan seuraava:
'! ! csgd'
Esimerkki
\1:n sijasta voidaan kirjoittaa \g1:
<?php
$res = preg_replace('#([a-z])[a-z]+\g1#', '!', $str);
?>
Esimerkki
Voidaan myös kirjoittaa \g{1}:
<?php
$res = preg_replace('#([a-z])[a-z]+\g{1}#', '!', $str);
?>
Esimerkki
aaltosuluissa voidaan määrittää negatiivisia lukuja. Tässä tapauksessa sulkumerkit lasketaan lopusta:
<?php
$res = preg_replace('#([a-z])([a-z])\g{-2}#', '!', $str);
?>
Käytännön tehtävät
Annettu merkkijono:
<?php
$str = 'aaa bbb ccc xyz';
?>
Etsi kaikki osajonot, joissa on kolme samaa kirjainta peräkkäin.
Annettu merkkijono:
<?php
$str = 'a aa aaa abab bbbb';
?>
Etsi kaikki osajonot, joissa on kaksi tai useampia samoja kirjaimia peräkkäin.
Annettu merkkijono:
<?php
$str = 'aaa aaa bbb bbb ccc ddd';
?>
Etsi kaikki osajonot, joissa on kaksi samaa sanaa peräkkäin.