V Perlových regulárních výrazech mají znaky \^$.+*?[(){|
speciální význam a je nutné je escapovat znakem \
. Speciální význam má dále znak použitý pro ohraničení regulárního výrazu. Uvnitř seznamu možných znaků []
mají speciální význam znaky \^-]
a je nutné je buď zapisovat na začátku nebo konci seznamu znaků nebo je – na rozdíl od Posixových regulárních výrazů – lze také escapovat znakem \
.
Kromě toho se regulární výrazy většinou zapisují přímo do PHP řetězců (a nenačítají se např. ze souboru), takže kromě ošetření znaků speciálních v regulárních výrazech je nutné ošetřit také znaky s významem v PHP – u řetězců v apostrofech \'
, u řetězců v uvozovkách potom \"$
.
<?php preg_match('~http://www.example.com/~([^/]+)~', $url); // špatně, ~ je použit pro ohraničení regulárního výrazu preg_match('~C:\\Windows~', $path); // špatně, \ je speciální znak jak v regulárních výrazech, tak v PHP preg_match('~C:\\\\Windows~', $path); // správně preg_match('~[+-/*]~', $math); // špatně, pomlčka má v seznamu znaků zvláštní význam, takže výraz strefí např. i tečku (viz ASCII tabulka) preg_match('~[-+/*]~', $math); // správně, na začátku seznamu zvláštní význam pomlčky mizí preg_match('~[+\\-/*]~', $math); // správně preg_match('~[\\+\\-/*]~', $math); // správně, ale escapování je zbytečně moc - plus nemá uvnitř seznamu znaků speciální význam ereg('[+\\-/*]', $math); // špatně, v Posixových seznamech znaků nelze pomocí \ escapovat preg_match('~\\<[^>]+~', $html); // správně, ale escapování je zbytečné, protože < nemá speciální význam ?>
Správné escapování je nezbytné, ale escapovat by se mělo jen to, co je escapovat opravdu potřeba, protože jinak se kód zbytečně znepřehledňuje a nadbytečné escapování může zavléci naopak chyby.
Diskuse je zrušena z důvodu spamu.