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
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
Výsledek zapsaný do proměnné bude následující:
'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
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
Výsledek zapsaný do proměnné bude následující:
'! ax aax aaax'
Příklad
V tomto příkladu šablona vypadá takto: písmeno
'a', poté tečka '.', poté
písmeno 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
Výsledek zapsaný do proměnné bude následující:
'! 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
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
Výsledek zapsaný do proměnné bude následující:
'! ! !'
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
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
preg_replace('#a.x#', '!', 'a.x abx azx'); // vrátí '! ! !', ale očekávalo se '! abx azx'
?>