<meta http-equiv='pics-label' content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline EN v2.0" l gen true for "http://interval.cz" r (nz 1 vz 1 lz 1 oz 1 cz 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://interval.cz" r (n 0 s 0 v 0 l 0))' />
<h2>Perl-compatible regulßrnφ v²razy v PHP - dalÜφ u₧iteΦnΘ funkce</h2>
<p id='prepend'>Ve vÜech p°edchßzejφcφch Φlßncφch jsme si p°i p°edvßd∞nφ jednotliv²ch regulßrnφch v²raz∙ vystaΦili pouze se dv∞ma funkcemi. V tomto Φlßnku se proto seznßmφme s n∞kolika dalÜφmi u₧iteΦn²mi funkcemi pro prßci s Perl-compatible regulßrnφmi v²razy v PHP. Vzhledem k tomu, ₧e vÜe, co se t²Φe konstrukce regulßrnφch v²raz∙ samotn²ch, bylo ji₧ probrßno, budu se p°i popisovßnφ jednotliv²ch p°φklad∙ v∞novat hlavn∞ funkcφm sam²m.</p>
<h3>Funkce preg_match_all()</h3>
<p>Funkce <code>preg_match_all($re,$str,$matched)</code> funguje velmi podobn∞ jako funkce <code>preg_match($re,$str,$matched)</code> (viz <a href='http://interval.cz/clanek.asp?article=3792' title='Pecka, Miroslav: Perl-compatible regulßrnφ v²razy v PHP - subv²razy a zp∞tnß reference'>subv²razy a zp∞tnß reference</a>) jen s tφm rozdφlem, ₧e najde v °et∞zci <samp>$str</samp> vÜechny °et∞zce, kterΘ odpovφdajφ regulßrnφmu v²razu <samp>$re</samp> (zatφmco <code>preg_match($re,$str,$matched)</code> najde jen prvnφ v²skyt). Funkce <code>preg_match_all()</code> vracφ poΦet °et∞zc∙, kterΘ odpovφdajφ celΘmu regulßrnφmu v²razu.</p>
<p>Pole <samp>$matched1</samp> pak bude (<samp>var_dump($matched1)</samp>):</p>
<div class='sample'>
array(3) {
<br /> [0]=>
<br /> string(8) "CZK 1200"
<br /> [1]=>
<br /> string(3) "CZK"
<br /> [2]=>
<br /> string(4) "1200"
<br />}
</div>
<p>Pole <samp>$matched2</samp> pak bude (<samp>var_dump($matched2)</samp>):</p>
<div class='sample'>
array(3) {
<br /> [0]=>
<br /> array(3) {
<br /> [0]=>
<br /> string(8) "CZK 1200"
<br /> [1]=>
<br /> string(6) "EUR 40"
<br /> [2]=>
<br /> string(6) "USD 50"
<br /> }
<br /> [1]=>
<br /> array(3) {
<br /> [0]=>
<br /> string(3) "CZK"
<br /> [1]=>
<br /> string(3) "EUR"
<br /> [2]=>
<br /> string(3) "USD"
<br /> }
<br /> [2]=>
<br /> array(3) {
<br /> [0]=>
<br /> string(4) "1200"
<br /> [1]=>
<br /> string(2) "40"
<br /> [2]=>
<br /> string(2) "50"
<br /> }
<br />}
</div>
<p>Index <samp>0</samp> v obou polφch (<samp>$matched1</samp> a <samp>$matched2</samp>) oznaΦuje, ₧e se jednß o °et∞zec (respektive °et∞zce) odpovφdajφcφ celΘmu regulßrnφmu v²razu. ╪et∞zce odpovφdajφcφ jednotliv²m subv²raz∙m jsou indexovßny Φφsly jednotliv²ch subv²raz∙ (v naÜem p°φpad∞ <samp>1</samp>, <samp>2</samp>). V poli <samp>$matched2</samp> je ka₧d² prvek (<samp>$matched2[0]</samp>, <samp>$matched2[1]</samp>, <samp>$matched2[2]</samp>) sßm o sob∞ polem. Indexy v t∞chto polφch odpovφdajφ (t°em) jednotliv²m nalezen²m °et∞zc∙m.</p>
<p>Pokud se vßm nelφbφ, ₧e takto vzniklΘ dvojrozm∞rnΘ pole <samp>$matched2</samp> je indexovßno nejd°φve podle subv²raz∙ a a₧ potΘ podle nalezen²ch °et∞zc∙, m∙₧ete toto chovßnφ zm∞nit pomocφ p°φznaku <code>PREG_SET_ORDER</code>, kter² se funkci p°edß jako jejφ Φtvrt² argument.</p>
<p>Pou₧ijeme-li stejnou hodnotu prom∞nn²ch <samp>$re</samp> a <samp>$str</samp> jako v p°ikladu v²Üe a zavolßme funkci <samp>preg_match_all($re, $str, $matched3, PREG_SET_ORDER)</samp>, tato funkce vytvo°φ pole <samp>$matched3</samp>:</p>
<div class='sample'>
array(3) {
<br /> [0]=>
<br /> array(3) {
<br /> [0]=>
<br /> string(8) "CZK 1200"
<br /> [1]=>
<br /> string(3) "CZK"
<br /> [2]=>
<br /> string(4) "1200"
<br /> }
<br /> [1]=>
<br /> array(3) {
<br /> [0]=>
<br /> string(6) "EUR 40"
<br /> [1]=>
<br /> string(3) "EUR"
<br /> [2]=>
<br /> string(2) "40"
<br /> }
<br /> [2]=>
<br /> array(3) {
<br /> [0]=>
<br /> string(6) "USD 50"
<br /> [1]=>
<br /> string(3) "USD"
<br /> [2]=>
<br /> string(2) "50"
<br /> }
<br />}
</div>
<h3>Funkce preg_grep()</h3>
<p>Funkce <code>preg_grep($re, $strings)</code> mß dva argumenty (parametry). Prvnφm argumentem je regulßrnφ v²raz, druh²m argumentem je pole °et∞zc∙. Funkce vracφ pole slo₧enΘ z prvk∙ (p∙vodnφho pole <samp>$strings</samp>), kterΘ odpovφdajφ regulßrnφmu v²razu <samp>$re</samp>.</p>
<p>╪ekn∞me, ₧e mßme pole obsahujφcφ hesla u₧ivatel∙ a chceme z nich vybrat pouze hesla delÜφ ne₧ 5 znak∙.</p>
<p>V²slednΘ pole <samp>$result</samp> bude obsahovat po₧adovanß hesla:</p>
<div class='sample'>
array(2) {
<br /> [2]=>
<br /> string(7) "abcdefg"
<br /> [3]=>
<br /> string(6) "hohoho"
<br />}
</div>
<h3>Funkce preg_replace_callback()</h3>
<p>Pomocφ funkce <code>preg_replace()</code> jsme mohli zam∞nit °et∞zec odpovφdajφcφ regulßrnφmu v²razu za jin² °et∞zec (s vyu₧itφm °et∞zce "zachycenΘho" pomocφ regulßrnφho v²razu Φi subv²razu). S pomocφ <code>preg_replace_callback()</code> dokß₧eme jeÜt∞ mnohem vφce. ╪et∞zec odpovφdajφcφ regulßrnφmu v²razu m∙₧eme toti₧ nahradit °et∞zcem, kter² zφskßme jako nßvratovou hodnotu vlastnφ (u₧ivatelsky definovanΘ) funkce. Tato naÜe funkce p°itom m∙₧e pracovat s °et∞zcem, kter² odpovφdß regulßrnφmu v²razu (Φi subv²razu).</p>
<p>╪ekn∞me, ₧e mßme k dispozici seznam dvojcifern²ch Φφsel, kterß p°edstavujφ roky (respektive letopoΦty). NaÜφm ·kolem je p°evΘst letopoΦty dvojcifernΘ na letopoΦty Φty°cifernΘ, a to tak, ₧e do roku 29 vΦetn∞ budou p°evßd∞ny na letopoΦty ve tvaru <samp>20XX</samp> a od roku 30 (vΦetn∞) v²Üe budou p°evßd∞ny na letopoΦty ve tvaru <samp>19XX</samp>. Asi tuÜφte, ₧e naÜe (u₧ivatelsky definovanß) funkce bude mφt za ·kol prßv∞ rozhodnout zda doplnit "19" Φi "20".</p>
<div class='sample'>
function letopocet($rok)
<br />{
<br /> if($rok[0]<30)
<br /> {
<br /> $prefix="20";}
<br /> else
<br /> {
<br /> $prefix="19";
<br /> };
<br /> return $prefix.$rok[0];
<br />};
<br />
<br />$re="/\d{2}/";
<br />$function_name="letopocet"; //nßzev u₧ivatelskΘ funkce
<p>CelΘ to funguje tak, ₧e funkce <code>preg_replace_callback()</code> zavolß u₧ivatelsky definovanou funkci (jejφ₧ nßzev obdr₧φ jako hodnotu svΘho druhΘho argumentu) a tΘ p°edß pole obsahujφcφ °et∞zec, kter² odpovφdß regulßrnφmu v²razu (p°φpadn∞ tΘ₧ °et∞zce, kterΘ odpovφdajφ jednotliv²m subv²raz∙m). ╪et∞zec, kter² odpovφdß celΘmu regulßrnφmu v²razu, je v poli pod indexem <samp>0</samp>. U₧ivatelskß funkce zpracuje n∞jak²m zp∙sobem p°edanß data a poÜle svou nßvratovou hodnotu zp∞t funkci <code>preg_replace_callback()</code>. Toto se provede pro ka₧dΘ nahrazenφ. V okam₧iku, kdy jsou vÜechna nahrazenφ provedena, m∙₧e funkce <code>preg_replace_callback()</code> skonΦit a vrßtit svou nßvratovou hodnotu (tedy cel² upraven² °et∞zec).</p>
<h3>Funkce preg_split()</h3>
<p>Funkce <code>preg_split($re, $str)</code>, rozd∞lφ °et∞zec <samp>$str</samp> na Φßsti, kterΘ vrßtφ jako pole °et∞zc∙. Jako odd∞lovaΦ se pou₧ije °et∞zec odpovφdajφcφ regulßrnφmu v²razu <samp>$re</samp>. Op∞t mal² p°φklad:</p>
<p>V naÜem p°φpad∞ regulßrnφmu v²razu popisujφcφmu odd∞lovaΦ odpovφdß (neprßzdn²) °et∞zec slo₧en² ze znak∙ Φßrka, st°ednφk a mezera v libovolnΘm po°adφ a poΦtu. A tak pole <samp>$result</samp> bude obsahovat ji₧ jen jednotlivΘ e-mailovΘ adresy:</p>
<div class='sample'>
array(4) {
<br /> [0]=>
<br /> string(15) "honza@inmail.cz"
<br /> [1]=>
<br /> string(15) "jarda@jarda.com"
<br /> [2]=>
<br /> string(14) "filip@mudrc.cz"
<br /> [3]=>
<br /> string(14) "tomas@svaty.cz"
<br />}
</div>
<h3>Funkce preg_quote()</h3>
<p>Tuto funkci m∙₧eme oznaΦit jako pomocnou. Nezpracovßvß toti₧ urΦit² °et∞zec pomocφ regulßrnφho v²razu, ale pom∙₧e nßm p°i tvorb∞ regulßrnφho v²razu. N∞kdy toti₧ pot°ebujeme vytvo°it regulßrnφ v²raz a₧ za b∞hu naÜeho skriptu a tak nem∙₧eme "ruΦn∞" oÜet°it metaznaky (doplnit p°ed n∞ <samp>\</samp>), jestli₧e chceme potlaΦit jejich specißlnφ funkΦnost.</p>
<p>Za b∞hu skriptu nßm vznikne nap°φklad °et∞zec <samp>a+b=c</samp>, kter² chceme pou₧φt jako regulßrnφ v²raz. Pokud zavolßme <samp>preg_quote("a+b=c")</samp>, funkce vrßtφ °et∞zec <samp>a\+b\=c</samp>.</p>
<p>Nesmφme zapomenout, ₧e cel² regulßrnφ v²raz je uzav°en v odd∞lovaΦφch (delimiters), m∞li bychom proto takΘ zajistit, aby znaku, kter² pou₧φvßme jako odd∞lovaΦ (v naÜem p°φpad∞ pou₧φvßme obyΦejnΘ lomφtko <samp>/</samp>) takΘ p°edchßzelo zp∞tnΘ lomφtko <samp>\</samp>. Proto₧e funkce nem∙₧e sama o sob∞ v∞d∞t, jak² odd∞lovaΦ pou₧φvßme, p°edßme ji tuto informaci v nepovinnΘm druhΘm argumentu.</p>
<p>Pokud tedy zavolßme nap°φklad <samp>preg_quote("a+b/c=d","/")</samp>, funkce vrßtφ °et∞zec <samp>a\+b\/c\=d</samp>. Jak m∙₧ete vid∞t, znak <samp>\</samp> je i p°ed znakem <samp>=</samp>, aΦkoli <samp>=</samp> nenφ metaznak. Funkce toti₧ dopl≥uje zp∞tnß lomφtka i p°ed znaky, kterΘ mohou tvo°it specißlnφ konstrukce (nap°φklad tvrzenφ o nßsledujφcφm a p°edchßzejφcφm). Zp∞tn²m lomφtkem jsou proto dopln∞ny znaky <samp>.</samp>, <samp>\</samp>, <samp>+</samp>, <samp>*</samp>, <samp>?</samp>, <samp>[</samp>, <samp>^</samp>, <samp>]</samp>, <samp>$</samp>, <samp>(</samp>, <samp>)</samp>, <samp>{</samp>, <samp>}</samp>, <samp>=</samp>, <samp>!</samp>, <samp><</samp>, <samp>></samp>, <samp>|</samp> a <samp>:</samp>.</p>