Navigace

Hlavnφ menu

 

Perl-compatible regulßrnφ v²razy v PHP - praktickΘ p°φklady

Po ·vodnφm (p°evß₧n∞ teoretickΘm) Φlßnku je na Φase si ukßzat, ₧e to skuteΦn∞ funguje. Proto si tentokrßt p°edvedeme, jak snadno m∙₧eme zkontrolovat sprßvn² zßpis telefonnφho Φφsla, hesla Φi URL.

MalΘ procviΦenφ

V p°edchozφm Φlßnku jsme probrali zßkladnφ konstrukce regulßrnφch v²raz∙. A proto₧e Φasto jeden p°φklad vydß za dva odstavce teorie, podφvejme se nynφ na n∞kolik praktick²ch p°φklad∙.

P°φklad 1. - telefonnφ Φφslo

Kontrola ΦeskΘho telefonnφho Φφsla v nßrodnφm Φi mezinßrodnφm formßtu m∙₧e b²t provedena pomocφ regulßrnφho v²razu ^(\+420)? ?\d{3} ?\d{3} ?\d{3}$. Subv²raz (\+420) odpovφdß ΦeskΘ p°edvolb∞, kterß je nepovinnß (subv²raz je nßsledovßn otaznφkem). Za p°edvolbou je nepovinnß mezera nßsledovanß t°emi trojicemi Φφslic, kterΘ mohou b²t odd∞leny mezerou. V²raz tedy p°edpoklßdß, ₧e ten, kdo bude telefonnφ Φφslo zadßvat, jej bu∩ napφÜe vcelku nebo Φφslice seskupφ po trojicφch (co₧ je jedinß sprßvnß mo₧nost u devφticifernΘho telefonnφho Φφsla).

P°φklad 2. - heslo

V∞tÜina systΘm∙, kterß pou₧φvß p°φstup chrßn∞n² heslem, vy₧aduje, aby heslo, kterΘ si u₧ivatel m∙₧e sßm zvolit, odpovφdalo urΦit²m pravidl∙m. ╪ekn∞me, ₧e heslo mß b²t minimßln∞ 6 a maximßln∞ 10 znak∙ dlouhΘ a smφ obsahovat pouze Φφslice a malß a velkß pφsmena anglickΘ abecedy (p°iΦem₧ heslo nesmφ zaΦφnat Φφslicφ). Zadßnφ vyhovφ regulßrnφ v²raz ^[a-zA-Z][0-9a-zA-Z]{5,9}$. Na zaΦßtku musφ b²t jedno pφsmeno anglickΘ abecedy za nφm₧ musφ nßsledovat minimßln∞ 5 a maximßln∞ 9 dalÜφch znak∙, kterΘ jsou Φφslicφ nebo pφsmenem anglickΘ abecedy.

P°φklad 3. - URL

N∞kdy je vhodnΘ kontrolovat takΘ URL zadßvanou do formulß°e (nap°φklad v diskusnφm f≤ru). Regulßrnφch v²raz∙ °eÜφcφch tento problΘm bychom mohli na internetu najφt desφtky (nap°φklad na RegexLib.com). Podφvejme se takΘ na jeden takov² v²raz. Oproti p°edchßzejφcφm dv∞ma p°φklad∙m bude tento o n∞co slo₧it∞jÜφ. Regulßrnφmu v²razu ^(http|ftp)s?://[a-zA-Z0-9][a-zA-Z0-9\-.]+\.[a-zA-Z]{2,6}(/|$)[][\w.?~%#&@/'\\=+-]*$ odpovφdß URL pro HTTP (respektive HTTPS) Φi FTP (resp. FTPS) protokol.

Prvnφ subv²raz popisuje mo₧nΘ protokoly (HTTP Φi FTP). Nßsleduje nepovinnΘ s, kterΘ rozÜi°uje povolenΘ protokoly o HTTPS a FTPS. Za sekvencφ :// nßsleduje prvnφ znak domΘny (povoleny jsou pouze pφsmena a Φφslice). Druh² a dalÜφ znak domΘny (krom∞ domΘny 1. °ßdu) smφ krom∞ pφsmen a Φφslic obsahovat takΘ pomlΦku a teΦku. Za poslednφm znakem domΘny 2. °ßdu musφ nßsledovat teΦka a za nφ domΘna prvnφho °ßdu (o dΘlce 2 a₧ 6 znak∙). DomΘna 1. °ßdu smφ b²t slo₧ena pouze z pφsmen. Vzhledem tomu, ₧e p°ed teΦkou odd∞lujφcφ domΘnu 2. °ßdu od domΘny 1. °ßdu je povolena (ve skupin∞ znak∙ [a-zA-Z0-9\-.]) takΘ teΦka, je t°eba zajistit, aby teΦku odd∞lujφcφ domΘnu 2. a 1. °ßdu algoritmus zpracovßvajφcφ regulßrnφ v²raz rozpoznal. Faktem je, ₧e tato teΦka je poslednφ teΦkou v domΘnovΘm jmΘn∞ a za domΘnov²m jmΘnem musφ nßsledovat bu∩ lomφtko nebo konec °et∞zce. Prav∞ t∞mto dv∞ma situacφm odpovφdß alternace v subv²razu (/|$). Tφm de facto Φßst regulßrnφho v²razu \.[a-zA-Z]{2,6} ukotvφme k prvnφmu lomφtku za domΘnov²m jmΘnem (respektive v druhΘm p°φpad∞ ukotvφme ke konci °et∞zce). Za subv²razem (/|$) ji₧ pouze nßsleduje skupina znak∙ povolen²ch ve zbytku URL (nßsledovanß kvantifikßtorem *, kter² signalizuje nepovinnost jakΘhokoli pokraΦovßnφ URL). Metaznaky ] a - jsou ve skupin∞ znak∙ na takovΘ pozici, ₧e se nem∙₧e uplatnit jejich specißlnφ v²znam (viz p°edchozφ Φlßnek) a nemusφ jim proto p°edchßzet zp∞tnΘ lomφtko.

Prßce v PHP

Mßme za sebou n∞kolik praktick²ch ukßzek regulßrnφch v²raz∙ a tak nezb²vß, ne₧ si ukßzat, jak pomocφ PHP provedeme porovnßnφ urΦitΘho °et∞zce (textu) s regulßrnφm v²razem. Jednou z funkcφ pro prßci s Perl-compatible regulßrnφmu v²razy je preg_match(). Funkce mß dva povinnΘ parametry (od nepovinn²ch parametr∙ zatφm odhlΘdneme), a to regulßrnφ v²raz a °et∞zec, kter² se mß s regulßrnφm v²razem porovnat.

D°φve, ne₧ se podφvßme na ukßzkov² k≤d, musφme si °φci o jednΘ velmi podstatnΘ skuteΦnosti. Samotn² regulßrnφ v²raz musφ b²t ohraniΦen odd∞lovaΦi (delimiters). Jako odd∞lovaΦ smφ b²t pou₧it (dle definice) libovoln² nealfanumerick² znak krom∞ zp∞tnΘho lomφtka (\). Nejb∞₧n∞ji se vÜak pou₧φvß obyΦejnΘ lomφtko (/). V naÜich p°φkladech budeme pou₧φvat prßv∞ tento odd∞lovaΦ. Pokud regulßrnφ v²raz samotn² obsahuje lomφtko (respektive obecn∞ znak pou₧it² jako odd∞lovaΦ), musφ lomφtku p°edchßzet znak \. Mßme nap°φklad regulßrnφ v²raz popisujφcφ Φφseln² zlomek ^\d+/\d+$. Pokud takov² regulßrnφ v²raz chceme pou₧φt jako parametr funkce preg_match(), musφme jej upravit na /^\d+\/\d+$/.

$re="/^\d+\/\d+$/"; //regulßrnφ v²raz
$str="6/12"; //testovan² °et∞zec
if(preg_match($re,$str))
{
   echo "╪et∞zec '$str' vyhovuje regulßrnφmu v²razu.";
}
else
{
   echo "╪et∞zec '$str' nevyhovuje regulßrnφmu v²razu nebo doÜlo k chyb∞.";
};

Funkce preg_match() vracφ 1 (pokud °et∞zec regulßrnφmu v²razu odpovφdß), 0 (pokud °et∞zec regulßrnφmu v²razu neodpovφdß) nebo FALSE (pokud doÜlo k chyb∞ - nap°φklad kdy₧ regulßrnφ v²raz mß chybnou konstrukci).

JednotlivΘ funkce (chovßnφ a parametry) pro prßci s regulßrnφmi v²razy se mohou mφrn∞ liÜit v zßvislosti na pou₧itΘ verzi PHP. Proto, pokud nebude uvedeno jinak, budu p°edpoklßdat nasazenφ na PHP 4.3.3 a vyÜÜφm. Detailnφ informace o chovßnφ a parametrech jednotliv²ch funkcφ v r∙zn²ch verzφch PHP naleznete v manußlu, konkrΘtn∞ v sekci Regular Expression Functions (Perl-Compatible).

Pecka, Miroslav (8. 2. 2005)

Perl-compatible regulßrnφ v²razy v PHP

Regulßrnφ v²razy jsou mocn²m nßstrojem, kter² m∙₧e v²razn∞ zjednoduÜit a zp°ehlednit k≤d programu. NejΦast∞ji je m∙₧eme pou₧φt p°i kontrole Φi "parsovßnφ" vstupnφch dat. Tato sΘrie Φlßnk∙ dosud nebyla ukonΦena!