Escaping av spesialtegn i regulære uttrykk i PHP
Anta at vi ønsker å gjøre slik at spesialtegnet representerer seg selv. For å gjøre dette må det escapes med en omvendt skråstrek. La oss se på eksempler.
Eksempel
I følgende eksempel ønsket forfatteren av det regulære uttrykket
at søkemønsteret skulle se slik ut: bokstaven
'a', deretter plusstegn '+', deretter
bokstaven 'x'. Imidlertid
escapet ikke kodeforfatteren tegnet '+', og derfor
ser søkemønsteret faktisk slik ut:
bokstaven 'a' en eller flere ganger, deretter
bokstaven 'x':
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
Resultatet som skrives til variabelen blir følgende:
'a+x ! ! !'
Eksempel
Nå har forfatteren escapet plusstegnet med en omvendt
skråstrek. Nå ser søkemønsteret slik ut,
som det skal: bokstaven 'a', deretter plusstegn
'+', deretter bokstaven 'x'.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
Resultatet som skrives til variabelen blir følgende:
'! ax aax aaax'
Eksempel
I dette eksemplet ser mønsteret slik ut: bokstaven
'a', deretter punktum '.', deretter
bokstaven 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
Resultatet som skrives til variabelen blir følgende:
'! abx azx'
Eksempel
I følgende eksempel glemte forfatteren å escape skråstreken, og det regulære uttrykket traff alle delstrenger, siden en uescaped punktum representerer et hvilket som helst tegn:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
Resultatet som skrives til variabelen blir følgende:
'! ! !'
Eksempel
Vær oppmerksom på at hvis du glemmer den omvendte skråstreken for punktum (når den skal representere seg selv) - kan dette være vanskelig å legge merke til:
<?php
preg_replace('#a.x#', '!', 'a.x'); // returnerer '!', som vi ønsket
?>
Visuelt fungerer det riktig (siden punktum
representerer et hvilket som helst tegn, inkludert et vanlig
punktum '.'). Men hvis strengen
der erstatninger skjer endres - vil vi se vår
feil:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // returnerer '! ! !', mens det forventedes '! abx azx'
?>