Erikoismerkkien escapaus PHP:n regexeissä
Oletetaan, että haluamme tehdä niin, että erikoismerkki tarkoittaa itseään. Tätä varten sitä täytyy escapata kenoviivalla. Katsotaanpa esimerkein.
Esimerkki
Seuraavassa esimerkissä regexin tekijä halusi,
että hakumalli näyttäisi tältä: kirjain
'a', sitten plus '+', sitten
kirjain 'x'. Kuitenkin, koodin tekijä
ei escapannut merkkiä '+' ja siksi
hakumalli itse asiassa näyttää tältä:
kirjain 'a' yksi tai useampi kerta, sitten
kirjain 'x':
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
Tuloksena muuttujaan kirjoitetaan seuraava:
'a+x ! ! !'
Esimerkki
Mutta nyt tekijä on escapannut plus-merkin kenoviivalla.
Nyt hakumalli näyttää siltä kuin pitääkin: kirjain
'a', sitten plus '+', sitten kirjain 'x'.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
Tuloksena muuttujaan kirjoitetaan seuraava:
'! ax aax aaax'
Esimerkki
Tässä esimerkissä hakumalli näyttää tältä: kirjain
'a', sitten piste '.', sitten
kirjain 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
Tuloksena muuttujaan kirjoitetaan seuraava:
'! abx azx'
Esimerkki
Seuraavassa esimerkissä tekijä unohti escapata pisteen ja regex osui kaikkiin alimerkkijonoihin, koska escapaamaton piste tarkoittaa mitä tahansa merkkiä:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
Tuloksena muuttujaan kirjoitetaan seuraava:
'! ! !'
Esimerkki
Huomaa, että jos unohdat kenoviivan pisteelle (kun sen pitäisi tarkoittaa itseään) - tätä ei ehkä edes huomaa:
<?php
preg_replace('#a.x#', '!', 'a.x'); // palauttaa '!', kuten halusimmekin
?>
Visuaalisesti toimii oikein (koska piste
tarkoittaa mitä tahansa merkkiä, myös tavallista
pistettä '.'). Mutta jos vaihdat merkkijonoa,
jossa korvaukset tapahtuvat - näemme virheemme:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // palauttaa '! ! !', odotettiin '! abx azx'
?>