Escapen van speciale tekens in PHP regex
Stel dat we willen dat een speciaal teken zichzelf vertegenwoordigt. Om dit te doen moet het worden geëscaped met behulp van een backslash (backslash). Laten we eens kijken naar voorbeelden.
Voorbeeld
In het volgende voorbeeld wilde de auteur van de regex
dat het zoekpatroon er als volgt uitzag: letter
'a', dan een plus '+', dan
letter 'x'. De auteur van de code
heeft het teken '+' echter niet geëscaped, en daarom
ziet het zoekpatroon er in werkelijkheid als volgt uit:
letter 'a' een of meer keer, daarna
letter 'x':
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
Als resultaat wordt het volgende in de variabele geschreven:
'a+x ! ! !'
Voorbeeld
Nu heeft de auteur de plus geëscaped met een
backslash. Nu ziet het zoekpatroon eruit
zoals bedoeld: letter 'a', dan plus
'+', dan letter 'x'.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
Als resultaat wordt het volgende in de variabele geschreven:
'! ax aax aaax'
Voorbeeld
In dit voorbeeld ziet het patroon er als volgt uit: letter
'a', dan een punt '.', dan
letter 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
Als resultaat wordt het volgende in de variabele geschreven:
'! abx azx'
Voorbeeld
In het volgende voorbeeld vergat de auteur de punt te escapen en werden alle substrings geraakt door de regex, omdat een niet-geëscapte punt staat voor elk willekeurig teken:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
Als resultaat wordt het volgende in de variabele geschreven:
'! ! !'
Voorbeeld
Let op dat als je de backslash voor de punt vergeet (wanneer deze zichzelf moet vertegenwoordigen) - dit kan zelfs onopgemerkt blijven:
<?php
preg_replace('#a.x#', '!', 'a.x'); // retourneert '!', zoals we wilden
?>
Visueel werkt het correct (omdat de punt
voor elk willekeurig teken staat, inclusief een gewone
punt '.'). Maar als we de string veranderen
waarin de vervangingen plaatsvinden - dan zien we onze
fout:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // retourneert '! ! !', maar werd verwacht '! abx azx'
?>