⊗ppPmRgESCh 226 of 447 menu

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' ?>
freshyrouzc