Escapování v regulárních výrazech

Školení, která pořádám

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.

Jakub Vrána, Dobře míněné rady, 12.9.2005, diskuse: 5 (nové: 0)

Diskuse

Michal Molhanec:

IMHO jde '~[+\\-/*]~' zapsat i jednoduseji jako '~[+\-/*]~'.

Kawasaki:

IMHO nejde

ikona Jakub Vrána OpenID:

Viz http://www.dgx.cz/trine/item/regularni-korektura-…#comment-752

Michal Molhanec:

takze jde o filozoficky problem :-) IMHO je to zbytecny, escapovat \ je u ' retezcu potreba pouze ve dvou vyjimecnych pripadech. ono je mozna vubec skoda, ze ' retezce vubec pouzivaj escapovani pomoci \

Arcao:

Taky by neskodilo zminit fci preg_quote: http://www.php.net/manual/cs/function.preg-quote.php

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.