Escaping af specialtegn i PHP regulære udtryk
Antag at vi ønsker at gøre så et specialtegn repræsenterer sig selv. For at gøre dette skal det escapes med en omvendt skråstreg. Lad os se på nogle eksempler.
Eksempel
I det følgende eksempel ønskede forfatteren af det regulære udtryk,
at søgemønstret skulle se sådan ud: bokstavet
'a', derefter plus '+', derefter
bogstavet 'x'. Men forfatteren af koden
escapede ikke tegnet '+', og derfor
ser søgemønstret faktisk sådan ud:
bokstavet 'a' en eller flere gange, derefter
bogstavet 'x':
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
Resultatet i variablen vil være følgende:
'a+x ! ! !'
Eksempel
I dette tilfælde har forfatteren escapet plus-tegnet med en omvendt
skråstreg. Nu ser søgemønstret ud som det skal: bokstavet
'a', derefter plus '+', derefter bogstavet 'x'.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
Resultatet i variablen vil være følgende:
'! ax aax aaax'
Eksempel
I dette eksempel ser mønstret sådan ud: bokstavet
'a', derefter punktum '.', derefter
bogstavet 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
Resultatet i variablen vil være følgende:
'! abx azx'
Eksempel
I det følgende eksempel glemte forfatteren at escape skråstregen, og det regulære udtryk ramte alle delstrenge, da en ikke-escapet punktum repræsenterer ethvert tegn:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
Resultatet i variablen vil være følgende:
'! ! !'
Eksempel
Vær opmærksom på, at hvis du glemmer den omvendte skråstreg for punktum (når den skal repræsentere sig selv) - kan det være man ikke lægger mærke til det:
<?php
preg_replace('#a.x#', '!', 'a.x'); // returnerer '!', som vi ønskede
?>
Visuelt fungerer det korrekt (da punktum
repræsenterer ethvert tegn, inklusive et almindeligt
punktum '.'). Men hvis strengen,
hvor erstatningerne foretages, ændres - vil vi se vores
fejl:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // returnerer '! ! !', men forventet var '! abx azx'
?>