Ekranowanie znaków specjalnych w regex PHP

Załóżmy, że chcemy sprawić, aby znak specjalny oznaczał sam siebie. W tym celu należy go ekranować za pomocą ukośnika odwrotnego. Przyjrzyjmy się przykładom.

Przykład

W następującym przykładzie autor wyrażenia regularnego chciał, aby wzorzec wyszukiwania wyglądał następująco: litera 'a', następnie plus '+', następnie litera 'x'. Jednakże autor kodu nie wyekranował symbolu '+' i dlatego wzorzec wyszukiwania w rzeczywistości wygląda tak: litera 'a' jeden lub więcej razy, potem litera 'x':

php<?php
  $str = 'a+x ax aax aaax';
  $res = preg_replace('#a+x#', '!', $str);
?>

W rezultacie do zmiennej zapisze się następująco:

php'a+x ! ! !'

Przykład

A teraz autor wyekranował plus ukośnikiem odwrotnym. Teraz wzorzec wyszukiwania wygląda tak, jak należy: litera 'a', następnie plus '+', następnie litera 'x'.

php<?php
  $str = 'a+x ax aax aaax';
  $res = preg_replace('#a\+x#', '!', $str);
?>

W rezultacie do zmiennej zapisze się następująco:

php'! ax aax aaax'

Przykład

W tym przykładzie wzorzec wygląda tak: litera 'a', następnie kropka '.', następnie litera 'x':

php<?php
  $str = 'a.x abx azx';
  $res = preg_replace('#a\.x#', '!', $str);
?>

W rezultacie do zmiennej zapisze się następująco:

php'! abx azx'

Przykład

W następnym przykładzie autor zapomniał wyekranować ukośnik i pod wyrażenie regularne trafiły wszystkie podciągi, ponieważ niewyekranowana kropka oznacza dowolny znak:

php<?php
  $str = 'a.x abx azx';
  $res = preg_replace('#a.x#', '!', $str);
?>

W rezultacie do zmiennej zapisze się następująco:

php'! ! !'

Przykład

Zwróć uwagę, że jeśli zapomnisz o ukośniku odwrotnym dla kropki (kiedy powinna oznaczać samą siebie) - można tego nawet nie zauważyć:

php<?php
  preg_replace('#a.x#', '!', 'a.x'); // zwróci '!', tak jak chcieliśmy
?>

Wizualnie działa poprawnie (ponieważ kropka oznacza dowolny znak, w tym również zwykłą kropkę '.'). Ale jeśli zmienimy ciąg, w którym odbywają się zamiany - zobaczymy nasz błąd:

php<?php
  preg_replace('#a.x#', '!', 'a.x abx azx'); // zwróci '! ! !', a oczekiwano '! abx azx'
?>