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
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
Výsledkom zapísaným do premennej bude:
'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
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
Výsledkom zapísaným do premennej bude:
'! ax aax aaax'
Príklad
V tomto príklade vzor vyzerá takto: písmeno
'a', potom bodka '.', potom
písmeno 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
Výsledkom zapísaným do premennej bude:
'! 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
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
Výsledkom zapísaným do premennej bude:
'! ! !'
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
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
preg_replace('#a.x#', '!', 'a.x abx azx'); // vráti '! ! !', ale očakávalo sa '! abx azx'
?>