Escapování speciálních znaků v regulárních výrazech PHP

Předpokládejme, že chceme, aby speciální znak označoval sám sebe. K tomu je potřeba jej escapovat pomocí zpětného lomítka. Podívejme se na příkladech.

Příklad

V následujícím příkladu autor regulárního výrazu chtěl, aby vyhledávací šablona vypadala takto: písmeno 'a', poté plus '+', poté písmeno 'x'. Avšak autor kódu neescapoval symbol '+', a proto vyhledávací šablona ve skutečnosti vypadá takto: písmeno 'a' jedno nebo vícekrát, poté písmeno 'x':

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

Výsledek zapsaný do proměnné bude následující:

php'a+x ! ! !'

Příklad

A nyní autor escapoval plus zpětným lomítkem. Nyní vyhledávací šablona vypadá tak, jak má: písmeno 'a', poté plus '+', poté písmeno 'x'.

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

Výsledek zapsaný do proměnné bude následující:

php'! ax aax aaax'

Příklad

V tomto příkladu šablona vypadá takto: písmeno 'a', poté tečka '.', poté písmeno 'x':

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

Výsledek zapsaný do proměnné bude následující:

php'! abx azx'

Příklad

V následujícím příkladu autor zapomněl escapovat lomítko a regulární výraz zachytil všechny podřetězce, protože neescapovaná tečka označuje libovolný znak:

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

Výsledek zapsaný do proměnné bude následující:

php'! ! !'

Příklad

Všimněte si, že pokud zapomenete zpětné lomítko pro tečku (když má označovat sama sebe) - lze to snadno přehlédnout:

php<?php
  preg_replace('#a.x#', '!', 'a.x'); // vrátí '!', jak jsme chtěli
?>

Vizuálně to funguje správně (protože tečka označuje libovolný znak, včetně obyčejné tečky '.'). Ale pokud změníme řetězec, ve kterém se provádějí nahrazení - uvidíme naši chybu:

php<?php
  preg_replace('#a.x#', '!', 'a.x abx azx'); // vrátí '! ! !', ale očekávalo se '! abx azx'
?>