Oddělovač v regulárních výrazech

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

V PHP jsou kromě POSIXových regulárních výrazů (které jsou slabé a pomalé), také Perlové. Regulární výraz se v Perlových regulárních výrazech uvozuje jedním znakem (obvykle /), následuje maska a nakonec znovu první znak a případné modifikátory. Přijde mi to jako ukázková „Perlovina“, mnohem čistší by bylo předávat jenom masku a případné modifikátory jako další parametry funkce, ale s tím už nic nenadělám. Otázka je, jaký znak pro oddělovač používat. Lomítko je krajně nepraktické např. při parsování HTML, takže já osobně používám vlnku ~ – skoro nikde se nepoužívá a je dostatečně výrazná, takže je na první pohled poznat, kde končí maska a začínají modifikátory, narozdíl např. od !, který někdo také používá.

<?php
preg_match('~<a href="([^"]+)">(.*)</a>~U', $body);
?>

Od PHP 4.0.4 jdou používat i oddělovače v podobě závorek (), {}, [] nebo <>. Jejich výhoda spočívá v tom, že je uvnitř výrazu můžeme použít bez jakéhokoliv ošetřování, nevýhoda zase v tom, že jako oddělovač nejsou moc výrazné.

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

Diskuse

brm:

Ja pouzivam (vetsinou) svislou carku |.

A divit se perlovinam v perl-like regexpech ... mne se to nahodou libi :)

ikona dgx:

Nojo, ale to je pak opruz psat výčty (jedna|dva|tri), ne?

ikona llook:

Nejcasteji svislitko (tj. |). Zkousel jsem vsechno mozne, vcetne {expr}mods, ale nakonec jsem skoncil u svislitka.

Prave diky tem oddelovacum jsem se PCRE driv bal, bylo to pro me jak cinstina. Kdyz jsem ale zjistil, ze vetsinu ereg_ vyrazu staci obalit oddelovacem a funguji pak i s preg_, s posixem jsem definitivne skoncil.

Juzna:

A jiank mezi tema oddelovacema neni zadnej rozdil?
Just stejny na zacatku a na konci a je jedno ktery? Nebo se jeste nejak lisi?

AndzinSan:

no ja ani len netušim čo su to tie  regularne vyrazi, ocenil by som nejaky detajlnejsi ppopis

ikona D1ce:

A co takhle chvíli hledat?
http://interval.cz/clanky/perl-compatible-…-konstrukce/

Honza Odvárko:

Já používám jako oddělovač hvězdičku a jsem za vodou ;)

Jakub Tesárek:

Definitivně tildu. Už léta používám ~ a pln2 mi to vyhovuje. Jak píše Jakub, skoro nikde se nepoužívá a navíc jsou za ní hezky vidět další modifikátory.

Jinak k tomu regulárnímu výrazu cos posílal na fb, proč píšeš [A-Za-z0-9_] místo prostého \w? Pak jsou ty regulární výrazy strašně dlouhé a nepřehledné ne, když místo dvou znaků použiješ 10.

ikona Jakub Vrána OpenID:

\w skoro nepoužívám, protože závisí na locales: http://php.net/regexp.reference.escape. Nejsem si jist, jestli i v JavaScriptu, ale onen regulární výraz používám s mírnými úpravami v PHP i v JavaScriptu, tak těch úprav nechci dělat víc, než je nezbytně nutné.

Miroslav Koula:

Já dost často používám mřížku # a semtam i klasické /, když se mi to nikde nehádá - nedělám HTML a po Jakubovi sem zdědil i vlnovku ~ a nechávám jí tam :-)

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 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.