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
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
W rezultacie do zmiennej zapisze się następująco:
'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
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
W rezultacie do zmiennej zapisze się następująco:
'! ax aax aaax'
Przykład
W tym przykładzie wzorzec wygląda tak: litera
'a', następnie kropka '.', następnie
litera 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
W rezultacie do zmiennej zapisze się następująco:
'! 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
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
W rezultacie do zmiennej zapisze się następująco:
'! ! !'
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
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
preg_replace('#a.x#', '!', 'a.x abx azx'); // zwróci '! ! !', a oczekiwano '! abx azx'
?>