Speciális karakterek escape-elése PHP reguláris kifejezésekben
Tegyük fel, hogy azt szeretnénk elérni, hogy egy speciális karakter önmagát jelölje. Ehhez escape-elni kell egy visszaperjelellel. Nézzük meg példákon.
Példa
A következő példában a reguláris kifejezés szerzője azt szerette volna,
hogy a keresési minta így nézzen ki: az
'a' betű, majd egy plusz '+', majd
az 'x' betű. Azonban a kód szerzője
nem escape-elte a '+' karaktert, ezért
a keresési minta valójában így néz ki:
az 'a' betű egy vagy többször, majd
az 'x' betű:
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
Ennek eredményeképpen a változóba a következő íródik:
'a+x ! ! !'
Példa
Most a szerző escape-elte a pluszt egy visszaperjelellel.
Most a keresési minta olyan, amilyennek lennie kell: az
'a' betű, majd egy plusz
'+', majd az 'x' betű.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
Ennek eredményeképpen a változóba a következő íródik:
'! ax aax aaax'
Példa
Ebben a példában a minta így néz ki: az
'a' betű, majd egy pont '.', majd
az 'x' betű:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
Ennek eredményeképpen a változóba a következő íródik:
'! abx azx'
Példa
A következő példában a szerző elfelejtette escape-elni a pontot, és a reguláris kifejezés minden részsztringre illeszkedett, mivel az escape-elatlan pont bármely karaktert jelöl:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
Ennek eredményeképpen a változóba a következő íródik:
'! ! !'
Példa
Figyeljük meg, hogy ha elfelejtjük a visszaperjelet a pont előtt (amikor önmagát kellene jelölje) - ezt észre sem vehetjük:
<?php
preg_replace('#a.x#', '!', 'a.x'); // visszaadja '!'-t, ahogy szerettük volna
?>
Vizuálisan helyesen működik (mivel a pont
bármely karaktert jelöl, beleértve a közönséges
pontot '.' is). De ha megváltoztatjuk a sztringet,
amiben a csere történik - látni fogjuk a hibánkat:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // visszaadja '! ! !'-t, de '! abx azx' vártuk
?>