Maskierung von Sonderzeichen in PHP-Regex
Nehmen wir an, wir möchten, dass ein Sonderzeichen sich selbst bezeichnet. Dazu muss es mit einem Backslash maskiert werden. Sehen wir uns das an einigen Beispielen an.
Beispiel
Im folgenden Beispiel wollte der Autor des regulären Ausdrucks,
dass das Suchmuster so aussieht: Buchstabe
'a', dann Pluszeichen '+', dann
Buchstabe 'x'. Allerdings hat der Code-Autor
das Symbol '+' nicht maskiert, und deshalb
sieht das Suchmuster in Wirklichkeit so aus:
Buchstabe 'a' ein- oder mehrmals, dann
Buchstabe 'x':
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
In der Variable steht danach folgendes:
'a+x ! ! !'
Beispiel
Jetzt hat der Autor das Pluszeichen mit einem Backslash
maskiert. Nun sieht das Suchmuster so aus,
wie es soll: Buchstabe 'a', dann Pluszeichen
'+', dann Buchstabe 'x'.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
In der Variable steht danach folgendes:
'! ax aax aaax'
Beispiel
In diesem Beispiel sieht das Muster so aus: Buchstabe
'a', dann Punkt '.', dann
Buchstabe 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
In der Variable steht danach folgendes:
'! abx azx'
Beispiel
Im nächsten Beispiel hat der Autor vergessen, den Punkt zu maskieren, und unter den regulären Ausdruck fielen alle Teilzeichenketten, da ein unmaskierter Punkt für ein beliebiges Zeichen steht:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
In der Variable steht danach folgendes:
'! ! !'
Beispiel
Beachten Sie, dass man es möglicherweise nicht einmal bemerkt, wenn man den Backslash für den Punkt vergisst (wenn sie sich selbst bezeichnen soll):
<?php
preg_replace('#a.x#', '!', 'a.x'); // gibt '!' zurück, wie gewünscht
?>
Visuell funktioniert es korrekt (da der Punkt
ein beliebiges Zeichen bezeichnet, einschließlich eines normalen
Punkts '.'). Aber wenn wir die Zeichenkette ändern,
in der die Ersetzungen vorgenommen werden, sehen wir unseren
Fehler:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // gibt '! ! !' zurück, erwartet wurde '! abx azx'
?>