Regulárne výrazy
Regulárne výrazy slúžia na spracovanie textových reťazcov. Pomocou regulárnych výrazov si určíme masku a potom zisťujeme, či daný textový reťazec tejto maske vyhovuje. To znamená, že textový reťazec musí obsahovať rovnaké znaky ako regulárny výraz. Pri vytváraní regulárnych výrazov sa velmi často používajú tzv. metaznaky.
Metaznaky
| Bodka a spätné lomítko | ||
|---|---|---|
. |
ľubovoľný znak | a.c zodpovedá abc, aoc, a2c a pod. |
\ |
vracia metaznaku pôvodný význam | a\+b zodpovedá a+b |
| Kvantifikátory | ||
? |
minimálne 0x, maximálne 1x | ab?c zodpovedá ac a abc |
* |
minimálne 0x, maximálne neobmezene krát | abcde* zodpovedá abcd, abcde, abcdeeee a pod. |
+ |
minimálne 1x, maximálne neobmezene krát | abcde* zodpovedá abcde, abcdeeee a pod. |
{n} |
práve n-krát | 10{6} zodpovedá práve 1000000 |
{m,n} |
minimálne m-krát, maximálne n-krát | 10{2,4} zodpovedá práve 100, 1000 a 10000 |
{n,} |
minimálne n-krát | 10{2,} zodpovedá 100, 1000, 10000 a pod. |
| Skupina znakov | ||
[ ] |
jeden znak v zátvorkách | [abc] zodpovedá práve a, b, c |
[^ ] |
jeden znak neuvedený v zátvorkách | [^abc] zodpovedá ľubovoľnému znaku okrem a, b, c |
[ - ] |
jeden znak z rozsahu znakov | [a-z] zodpovedá malým písmenám abecedy |
\s |
biely znak (\n, \r, \t, medzera atď.) | a\sb zodpovedá a b |
\S |
iný než biely znak | a\Sb zodpovedá a+b |
\d |
číslice [0-9] | a\db zodpovedá a2b |
\D |
nečíselný znak | a\Db zodpovedá axb |
\w |
alfanumerický znak a podtržník | a\wb zodpovedá 1, a, A, _ a pod. |
\W |
nealfanumerický znak | a\Wb zodpovedá $, !, ?, % a pod. |
| Hranice | ||
ˆ |
na začiatku reťazca alebo riadku | ^abc nájde abc len na začiatku reťazca/riadku |
$ |
na konci reťazca alebo riadku | xyz$ nájde xyz len na konci reťazca/riadku |
| Alternatívy a zoskupovanie | ||
| |
oddeľuje niekoľko výrazov | ahoj|nazdar zodpovedá práve jednému z reťazcov/pozdravov |
| oddeľuje niekoľko subvýrazov | a(b|c) zodpovedá práve ab a ac |
|
( ) |
kvantifikátor je aplikovaný na podreťazec | ko(ko)?s zodpovedá práve kos a kokos |
| odkaz na podreťazec | (\d)\1 resp. (\d)$1 zodpovedá 11, 22, 33 a pod. |
|
| Špeciálne zátvorkové konštrukcie | ||
(?: ) |
uzátvorkovanie netvoriace spätnú referenciu | (?:\d)(\d)\1 bude zodpovedať 122, 133, 455 a pod. |
(?# ) |
komentár - text v zátvorkách za znakom # je ignorovaný | a(?#test)b zodpvedá práve ab |
(?= ) |
kladné tvrdenie o následujúcom | abc(?=t) zodpovedá abc v abcd, ale nie v abca |
(?! ) |
záporné tvrdenie o následujúcom | abc(?!d) zodpovedá abc v abca, abcf, ale nie v abcd |
(?<= ) |
kladné tvrdenie o predchádzajúcom | \d{3}(?<=0) sekvencia 3 číslic; posledné musí byť 0 |
(?<! ) |
záporné tvrdenie o predchádzajúcom | \d{3}(?<!0) sekvencia 3 číslic; posledné nesmie byť 0 |
| Modifikátor | Názov | Funkčnosť |
|---|---|---|
i |
ignore case | nerozlišovanie malých/veľkých písmen |
s |
single line | |
m |
multiple lines | |
x |
extended | biele znaky a komentáre (znaky vpravo od #) sú ignorované |
g |
global match | hľadané všetky časti reťazca, ktoré zodpovedajú regulárnemu výrazu |
Príklady
| Regulárny výraz | Výsledok |
|---|---|
a+ |
sekvencia písmen a (1 a viac znakov) |
a* |
sekvencia písmen a (0 a viac znakov) |
o?sud |
osud alebo sud |
adr(esa)? |
adr alebo adresa |
vod(a|ka) |
voda alebo vodka |
[0-9]|[1-9][0-9] |
čísla 0 až 99 |
\d{2} |
sekvencia dvoch číslic desiatkovej sústavy (00, 01, ...,98, 99) |
[0-9a-fA-F]|[1-9a-fA-F][0-9a-fA-F]+ |
hexadecimálne čísla |
(19|20)\d{2} |
letopočty 1900-2099 |
\d{2,6} |
sekvencia dvoch až šiestich číslic |
[^ ,.]+ |
neprázdna sekvencia znakov, medzi ktorými nemôže byť medzera, čiarka alebo bodka |
^P.* |
reťazec začína písmenom P, za ktorým nasleduje ľubovoľný (aj nulový) počet ľubovoľných znakov |
\d+0$ |
reťazec končí znakom 0 (nula), ktorému predchádza minimálne jedna číslica |
a+b |
ab, aab, aaab atď. |
a\+b |
a+b |
preg_replace()
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit [, int &$count ]] )
Funkcia hľadá zhodu regulárneho výrazu pattern s reťazcom subject. Pokiaľ je zhoda nájdená, časť reťazca subject zodpovedajúca regulárnemu výrazu pattern je nahradená reťazcom replacement.
Argument pattern môže byť reťazec alebo pole (pole regulárnych výrazov, ktoré sa použijú postupne pri porovnaní). Argument subject môže byť reťazec či pole (pole reťazcov, v ktorých sa má vykonať náhrada).
Pokiaľ došlo ku zhode, funkcia vracia zmenený reťazec (alebo pole reťazcov, pokiaľ je argumentom subject pole). Pokiaľ ku zhode nedošlo, vracia funkcia pôvodný reťazec alebo pole subject.
<?php
$string = "Reťazec má štyri slová.";
echo $string . "\n";
$string = preg_replace('štyri', '4', $string);
echo $string;
?>
preg_match()
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]] )
Funkcia nájde prvú zhodu regulárneho výrazu pattern s reťazcom subject. Pokiaľ je funkcii predaná referencia na pole matches, sú do tohto poľa uložené časti reťazca subject, ktoré zodpovedajú jednotlivým subvýrazom regulárneho výrazu pattern. Pod indexem 0 je v poli matches uložená zhoda s celým regulárnym výrazom. V ďalších prvkoch poľa (1, 2, 3 ,...) sú uložené reťazce zodpovedajúce jednotlivým subvýrazom.
Funkcia vracia 0 pokiaľ nebola nájdená zhoda, 1 pokiaľ zhoda bola nájdená. Pokiaľ pri vykonávaní funkcie došlo k chybe (napríklad vinou neplatného regulárneho výrazu), funkcia vracia FALSE.
Pokiaľ chceme nájsť všetky zhody regulárneho výrazu s reťazcom, musíme použiť funkciu preg_match_all().
<?php
if (!preg_match('/^[1-9]\d{2}$/',$cislo)) // premenná $cislo môže byť napríklad vstupom z formuláru
{
echo "Zadané číslo nie je trojciferné!";
}
?>

