Escaping special characters in PHP regex
Antag att vi vill göra så att ett specialtecken representerar sig självt. För att göra detta måste det escapes med ett omvänt snedstreck. Låt oss titta på exempel.
Exempel
I följande exempel ville författaren till det reguljära uttrycket
att sökmönstret skulle se ut så här: bokstaven
'a', sedan ett plus '+', sedan
bokstaven 'x'. Men författaren till koden
escapade inte tecknet '+' och därför
ser sökmönstret egentligen ut så här:
bokstaven 'a' en eller flera gånger, sedan
bokstaven 'x':
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
Som ett resultat kommer följande att skrivas till variabeln:
'a+x ! ! !'
Exempel
Den här gången har författaren escapat plustecknet med ett omvänt
snedstreck. Nu ser sökmönstret ut som det ska: bokstaven
'a', sedan ett plus '+', sedan bokstaven 'x'.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
Som ett resultat kommer följande att skrivas till variabeln:
'! ax aax aaax'
Exempel
I det här exemplet ser mönstret ut så här: bokstaven
'a', sedan en punkt '.', sedan
bokstaven 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
Som ett resultat kommer följande att skrivas till variabeln:
'! abx azx'
Exempel
I nästa exempel glömde författaren att escap snedstrecket och alla delsträngar träffades av det reguljära uttrycket, eftersom en oescaped punkt representerar vilket tecken som helst:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
Som ett resultat kommer följande att skrivas till variabeln:
'! ! !'
Exempel
Observera att om du glömmer det omvända snedstrecket för punkten (när den ska representera sig själv) - så kanske du inte ens märker det:
<?php
preg_replace('#a.x#', '!', 'a.x'); // returnerar '!', som vi ville
?>
Visuellt fungerar det korrekt (eftersom punkten
representerar vilket tecken som helst, inklusive en vanlig
punkt '.'). Men om vi ändrar strängen
där ersättningarna sker - kommer vi att se vårt
misstag:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // returnerar '! ! !', men förväntat var '! abx azx'
?>