Perl-compatible regulßrnφ v²razy v PHP - modifikßtory a lφnΘ kvantifikßtory
V p°edchozφm Φlßnku jsme nakousli tΘma modifikßtor∙, a proto₧e modifikßtory jsou p°φliÜ velk²m soustem pro jeden Φlßnek, budeme v tomto tΘmatu pokraΦovat a ukß₧eme si dalÜφ Φty°i modifikßtory.
"Single line"
Jak jsem psal ji₧ v prvnφm Φlßnku, metaznaku . (teΦka) odpovφdajφ vÜechny znaky krom∞ \n. Pokud je vÜak pou₧it modifikßtor "single line" (kter² mß ovÜem v PHP internφ oznaΦenφ "PCRE_DOTALL"), metaznak . bude odpovφdat i znaku konce °ßdku \n. Modifikßtor "single line" mß zkratku "s".
"Extended" aneb komentß°e v regulßrnφch v²razech
Pokud pou₧ijeme modifikßtor "extended" (kter² mß zkratku "x"), zp∙sobφ to dv∞ zm∞ny ve vyhodnocovßnφ regulßrnφho v²razu:
- TakzvanΘ "bφlΘ znaky" v regulßrnφm v²razu budou ignorovßny, s v²jimkou bφl²ch znak∙ zapsan²ch v rßmci skupiny znak∙ a s v²jimkou p°φpadu, kdy bφlΘmu znaku bude p°edchßzet zp∞tnΘ lomφtko \.
- ╚ßst regulßrnφho v²razu vpravo od znaku # a₧ po znak konce °ßdku \n (vΦetn∞) bude ignorovßna. To umo₧≥uje vklßdat ve slo₧it²ch regulßrnφch v²razech komentß°e za znak #.
Pou₧itφ p°edvedu op∞t na ukßzce:
$str="ahoj";
preg_match($re,$str); //vrßtφ int(1), tedy shodu
V uvedenΘm regulßrnφm v²razu jsou obsa₧eny jak bφlΘ znaky (mezera), \n, \t, tak i text komentß°e (#m∙j vlastnφ komentß°), kter² bude zcela ignorovßn.
"Evaluate" - specißlnφ modifikßtor p°i nahrazovßnφ
Modifikßtor se zkratkou "e" (odvozeno od "evaluate", anglicky "vyhodnotit") m∙₧e b²t pou₧it pouze v regulßrnφch v²razech, kterΘ jsou argumentem funkce preg_replace()
(respektive jinde je jeho pou₧itφ ignorovßno). Pou₧ijeme-li tento modifikßtor, °et∞zec obsahujφcφ "text nßhrady" (v naÜich p°φkladech jsme pro n∞j pou₧φvali prom∞nnou $replacement) bude vyhodnocen jako PHP k≤d. Pou₧itφ si ukß₧eme na p°φkladu, kdy bude naÜφm cφlem p°evΘst vÜechny HTML tagy na malß pφsmena (pozor, pouze tagy, nikoli atributy).
$replacement="'\\1'.strtolower('\\2').'\\3'";
$str="<H1>Nadpis</H1>
<P>Text1</P>
<P>Text1</P>";
$result=preg_replace($re,$replacement,$str);
V²sledkem (obsahem prom∞nnΘ $result) pak je HTML k≤d:
<p>Text1</p>
<p>Text1</p>
VÜimn∞te si, ₧e krom∞ modifikßtoru "e" jsme pou₧ili i modifikßtor "i" (case insensitive). Jak vidφte, modifikßtory lze tedy kombinovat. StaΦφ je zapsat za sebou za koncov² odd∞lovaΦ / (na po°adφ zßpisu modifikßtor∙ p°itom nezßle₧φ).
Regulßrnφmu v²razu v prom∞nnΘ $re odpovφdajφ otevφracφ i uzavφracφ (p°φpadn∞ nepßrovΘ) HTML tagy (s i bez atribut∙). V²raz je slo₧en ze t°φ subv²raz∙. Prvnφmu subv²razu odpovφdß < (otvφracφ tag) nebo </ (uzavφracφ tag). DruhΘmu subv²razu odpovφdß sekvence znak∙ a-z (respektive A-Z, proto₧e je pou₧it modifikßtor "i"), kterß p°edstavuje tag samotn². T°etφmu subv²razu odpovφdß sekvence tΘm∞° libovoln²ch znak∙ (vÜe krom∞ znaku >) nßsledovanß znakem >.
Jak jste si asi vÜimli, tento p°φklad nenφ nepodobn² p°φkladu Φφslo 3 z p°edchozφho Φlßnku. V tomto p°φpad∞ vÜak zpracujeme °et∞zec p°edstavovan² zp∞tnou referencφ na druh² subv²raz (\\2) pomocφ PHP funkce strtolower()
, kterß p°evßdφ °et∞zec na malß pφsmena. Proto₧e je nynφ (kv∙li modifikßtoru "e") °et∞zec v prom∞nnΘ $replacement vyhodnocovßn jako PHP k≤d, musφ b²t zp∞tnΘ reference \\1 a \\3 uzav°eny (jako₧to °et∞zce) do jednoduch²ch uvozovek a spojeny s dalÜφmi °et∞zci (respektive °et∞zcem vracejφcφm volßnφ funkce strtolower('\\2')) pomocφ b∞₧nΘho PHP operßtoru pro spojovßnφ °et∞zc∙ (. - teΦka).
Kvantifikßtory podruhΘ - "lenost" kontra "nenasytnost"
Ji₧ v prvnφm Φlßnku jsme si uvedli seznam vÜech kvantifikßtor∙ a doposud jsme p°edpoklßdali, ₧e se bude kvantifikßtor sna₧it "poz°φt" co mo₧nß nejdelÜφ °et∞zec. Tedy nap°φklad, kdy₧ porovnßme °et∞zec abbb s regulßrnφm v²razem ^a(b+), pak prvnφmu subv²razu bude odpovφdat °et∞zec bbb. Dan² regulßrnφ v²raz by se samoz°ejm∞ "spokojil" (p°esn∞ji °eΦeno "by odpovφdal") i s °et∞zcem ab, mß-li vÜak k dispozici delÜφ °et∞zec, pou₧ije nejdelÜφ mo₧nou variantu, kterß jeÜt∞ vede ke shod∞. Proto °φkßme, ₧e kvantifikßtory jsou standardn∞ "nenasytnΘ" (greedy).
Pomocφ "ungreedy" modifikßtoru (kter² mß zkratku "U" a v PHP internφ oznaΦenφ "PCRE_UNGREEDY") je mo₧no p°epnout chovßnφ kvantifikßtor∙ z "nenasytnΘho" na "lφnΘ" (lazy). Pokud se budou kvantifikßtory chovat lφn∞, bude se kvantifikßtor sna₧it "poz°φt" minimßlnφ poΦet znak∙, kterΘ jsou t°eba, aby °et∞zec odpovφdal regulßrnφmu v²razu. Pokud pou₧ijeme (v "ungreedy" m≤du) op∞t °et∞zec abbb a regulßrnφ v²raz ^a(b+), prvnφmu subv²razu bude odpovφdat jednoznakov² °et∞zec b. Zbytek °et∞zce bude ignorovßn (nep°ehlΘdn∞te, ₧e je pou₧ito pouze ukotvenφ za zaΦßtku pomocφ ^ - vpravo od prvnφho v²skytu b a₧ do konce °et∞zce tak m∙₧e b²t cokoli).
Modifikßtor "U" zapne "lφnΘ" chovßnφ kvantifikßtor∙ globßln∞ pro cel² v²raz. Je vÜak takΘ mo₧nΘ, aby "zleniv∞ly" jen vybranΘ kvantifikßtory v °et∞zci. Ka₧d² konkrΘtnφ kvantifikßtor, kter² mß "zleniv∞t", musφ b²t bezprost°edn∞ nßsledovßn otaznφkem (?).
Mφsto kvantifikßtor∙ ?, *, +, {m,n}, {m,} (kde m je minimßlnφ poΦet v²skyt∙ a n je maximßlnφ poΦet v²skyt∙ - vφce viz prvnφ Φlßnek), m∙₧eme pou₧φt jejich lφnΘ varianty ??, *?, +?, {m,n}?, {m,}?.
Nßsledujφcφ tabulka nßzorn∞ ukazuje rozdφly v chovßnφ "nenasytn²ch" a "lφn²ch" kvantifikßtor∙, respektive jakß Φßst z modelovΘho °et∞zce bbbbbb bude odpovφdat (vytvß°et shodu) jednotliv²m regulßrnφm v²raz∙m.
Regulßrnφ v²raz | Shoda |
---|---|
b? | b |
b?? | (prßzdn² °et∞zec) |
b* | bbbbbb |
b*? | (prßzdn² °et∞zec) |
b+ | bbbbbb |
b+? | b |
b{2, 4} | bbbb |
b{2, 4}? | bb |
b{3,} | bbbbbb |
b{3,}? | bbb |
b{5} | bbbbb |
Dopl≥me jeÜt∞, ₧e pokud je pomocφ modifikßtoru "U" zapnuta globßlnφ "lenost", p°idßnφm otaznφku za konkrΘtnφ kvantifikßtor se jeho (lokßlnφ) chovßnφ p°epne na "nenasytnΘ".
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!
- Perl-compatible regulßrnφ v²razy v PHP - modifikßtory a lφnΘ kvantifikßtory (prßv∞ Φtete)
- Perl-compatible regulßrnφ v²razy v PHP - hranice
- Perl-compatible regulßrnφ v²razy v PHP - subv²razy a zp∞tnß reference
- Perl-compatible regulßrnφ v²razy v PHP - praktickΘ p°φklady
- Perl-compatible regulßrnφ v²razy v PHP - zßkladnφ konstrukce