Escapovanie špeciálnych znakov v regulárnych výrazoch PHP

Predpokladajme, že chceme dosiahnuť, aby špeciálny znak predstavoval sám seba. Na to je potrebné ho escapovať pomocou spätného lomítka. Pozrime sa na príklady.

Príklad

V nasledujúcom príklade autor regulárneho výrazu chcel, aby vyhľadávací vzor vyzeral takto: písmeno 'a', potom plus '+', potom písmeno 'x'. Avšak, autor kódu neescapoval symbol '+', a preto vyhľadávací vzor v skutočnosti vyzerá takto: písmeno 'a' jeden alebo viackrát, potom písmeno 'x':

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

Výsledkom zapísaným do premennej bude:

php'a+x ! ! !'

Príklad

Teraz autor escapoval plus spätným lomítkom. Teraz vyhľadávací vzor vyzerá tak, ako má: písmeno 'a', potom plus '+', potom písmeno 'x'.

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

Výsledkom zapísaným do premennej bude:

php'! ax aax aaax'

Príklad

V tomto príklade vzor vyzerá takto: písmeno 'a', potom bodka '.', potom písmeno 'x':

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

Výsledkom zapísaným do premennej bude:

php'! abx azx'

Príklad

V nasledujúcom príklade autor zabudol escapovať lomítko a pod regulárny výraz spadli všetky podreťazce, pretože neescapovaná bodka predstavuje akýkoľvek znak:

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

Výsledkom zapísaným do premennej bude:

php'! ! !'

Príklad

Všimnite si, že ak zabudnete spätné lomítko pre bodku (keď by mala predstavovať samu seba) - je možné si toho ani nevšimnúť:

php<?php
  preg_replace('#a.x#', '!', 'a.x'); // vráti '!', ako sme chceli
?>

Vizuálne to funguje správne (pretože bodka predstavuje akýkoľvek znak, vrátane obyčajnej bodky '.'). Ale ak zmeníme reťazec, v ktorom sa vykonávajú náhrady - uvidíme našu chybu:

php<?php
  preg_replace('#a.x#', '!', 'a.x abx azx'); // vráti '! ! !', ale očakávalo sa '! abx azx'
?>