home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / novinky / Interval / clanek04.htm < prev    next >
Encoding:
Extensible Markup Language  |  2005-05-05  |  17.5 KB  |  142 lines

  1. <?xml version='1.0' encoding='windows-1250'?>
  2. <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
  3. <html xmlns='http://www.w3.org/1999/xhtml' xml:lang='cs' lang='cs'>
  4. <head>
  5. <meta http-equiv='Content-Type' content='text/html; charset=windows-1250' />
  6. <meta http-equiv='Content-language' content='cs' />
  7. <meta http-equiv='Cache-control' content='no-cache' />
  8. <meta http-equiv='Pragma' content='no-cache' />
  9. <meta http-equiv='Expires' content='-1' />
  10. <meta name='robots' content='index,follow' />
  11. <meta name='googlebot' content='index,follow,snippet,noarchive' />
  12. <meta name='description' content='Interval.cz - Internetov² magazφn o webdesignu, v²voji webov²ch aplikacφ a e-komerci. VÜe podstatnΘ o technologiφch XHTML, HTML, CSS, DHTML, JavaScript, XML, .NET, ASP, PHP, Java, J2ME, SQL, WAP...' />
  13. <meta name='keywords' content='Interval' />
  14. <meta name='ICBM' content='49.1915, 16.626' />
  15. <meta name='DC.Title' content='Interval.cz' />
  16. <meta name='DC.Identifier' content='http://interval.cz' />
  17. <meta name='DC.Language' content='cs' />
  18. <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))' />
  19. <meta http-equiv='imagetoolbar' content='no' />
  20. <meta http-equiv='MSThemeCompatible' content='no' />
  21. <meta name='MSSmartTagsPreventParsing' content='true' />
  22. <link rel='shortcut icon' type='image/x-icon' href='favicon.ico' />
  23. <link rel='alternate' type='application/rss+xml' title='RSS Interval.cz' href='http://interval.cz/__rss/rss.asp' />
  24. <link rel='home' href='http://interval.cz' />
  25. <link rel='search' href='http://interval.cz/search_ex.asp' />
  26. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/html4.css' />
  27. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/interval-display.css' />
  28. <link rel='stylesheet' type='text/css' media='print' href='__services/styles/interval-print.css' />
  29. <title>Perl-compatible regulßrnφ v²razy v PHP - specißlnφ typy uzßvorkovßnφ -- PHP -- V²voj aplikacφ -- Interval.cz</title>
  30. </head>
  31. <body class='interval interval-articles'>
  32. <div id='page-header'><div id='interval-logo'><h1 title='Interval.cz - denn∞ o tvorb∞ webu a e-komerci (logo & index link)'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz'>Interval.cz<span></span></a></h1></div><div id='advertising-page-header'></div><div class='page-maker'> </div></div>
  33. <div id='page-topmenu'><h2 class='textversion'>Navigace</h2><div id='page-mainmenu'><h3 class='textversion'>Hlavnφ menu</h3><ul><li class='first selected'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz'>Titulnφ strana</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=14'>Webdesign</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=15'>V²voj aplikacφ</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=18'>E-komerce</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=17'>Nßstroje</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=16'>Magazφn</a></li><li class='right selected'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.inshop.cz'>Knihkupectvφ</a></li><li class='right'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interforum.interval.cz'>Interforum</a></li></ul></div><div id='page-mainmenu-maker'> </div></div>
  34. <div id='page-body'><div id='page-left'><div id='article'>
  35.  
  36.  
  37. <h2>Perl-compatible regulßrnφ v²razy v PHP - specißlnφ typy uzßvorkovßnφ</h2>
  38. <p id='prepend'>KulatΘ zßvorky jsme doposud pou₧φvali pro ohraniΦenφ subv²raz∙, a to bu∩ proto, ₧e jsme cht∞li subv²raz doplnit kvantifikßtorem, nebo proto, ₧e jsme se na °et∞zec odpovφdajφcφ subv²razu cht∞li odkazovat pomocφ zp∞tnΘ reference. KulatΘ zßvorky se ale v Perl-compatible regulßrnφch v²razech pou₧φvajφ takΘ k sestavenφ specißlnφch konstrukcφ, kterΘ ovliv≥ujφ chovßnφ regulßrnφho v²razu.</p>
  39.  
  40. <p>Mezi tyto konstrukce pat°φ:</p>
  41.  
  42. <ul>
  43. <li>uzßvorkovßnφ netvo°φcφ zp∞tnΘ reference (non-capturing parentheses)</li>
  44. <li>pojmenovanΘ subv²razy (named subpatterns), respektive pojmenovanΘ zp∞tnΘ reference</li>
  45. <li>komentß°e (dalÜφ mo₧nost jejich zßpisu)</li>
  46. <li>modifikßtory (dalÜφ mo₧nost jejich zßpisu)</li>
  47. <li>"look ahead assetions" a "look behind assertions" (co₧ m∙₧eme v tomto kontextu p°elo₧it asi jako "tvrzenφ o nßsledujφcφm" a "tvrzenφ o p°edchßzejφcφm")</li>
  48. <li>podmφn∞nΘ subv²razy</li>
  49. </ul>
  50.  
  51. <h3>Uzßvorkovßnφ netvo°φcφ zp∞tnΘ reference</h3>
  52. <p>Pokud pou₧ijeme nap°φklad regulßrnφ v²raz <samp>^a(bc)+d$</samp>, budeme moci vyu₧φt zp∞tnou referenci na prvnφ (jedin²) subv²raz. Jestli₧e vÜak vφme, ₧e zp∞tnou referenci nebudeme pot°ebovat, ale p°esto pot°ebujeme urΦit opakovßnφ urΦitΘ sekvence znak∙ (v naÜem p°φpad∞ <samp>bc</samp> nßsledovanΘ kvantifikßtorem <samp>+</samp>), pak m∙₧eme pou₧φt takzvanΘ <em>uzßvorkovßnφ netvo°φcφ zp∞tnΘ reference</em> (non-capturing parentheses).</p>
  53. <p>Pokud pou₧ijeme regulßrnφ v²raz <samp>^a(?:bc)+d$</samp>, sekvence <samp>?:</samp> za levou kulatou zßvorkou zajistφ, ₧e na °et∞zec (<samp>bc</samp>) odpovφdajφcφ v²razu v t∞chto zßvorkßch se nebude mo₧no odkazovat pomocφ zp∞tnΘ reference. Pou₧itφ "uzßvorkovßnφ netvo°φcφho zp∞tnΘ reference" mß dv∞ v²hody. Jednak si poΦφtaΦ p°i zpracovßnφ regulßrnφho v²razu uÜet°φ prßci (respektive mφsto v pam∞ti), kdy₧ si nebude muset pamatovat zp∞tnΘ reference, jednak se tφmto zp∙sobem m∙₧e zp°ehlednit prßce se zp∞tn²mi referencemi v slo₧itΘm regulßrnφm v²razu.</p>
  54.  
  55. <h3>PojmenovanΘ subv²razy</h3>
  56. <p>Ve slo₧it∞jÜφm regulßrnφm v²razu m∙₧eme mφt mnoho subv²raz∙, kterΘ tvo°φ zp∞tnou referenci. Pak nemusφ b²t snadnΘ se v oΦφslovßnφ jednotliv²ch subv²raz∙ vyznat. Krom toho se m∙₧e stßt, ₧e na zaΦßtku regulßrnφho doplnφte pozd∞ji dalÜφ subv²raz a vÜechny subv²razy (vpravo od n∞j) se tφm p°eΦφslujφ. VhodnΘ proto je jednotlivΘ subv²razy pojmenovat vlastnφm oznaΦenφm (m∙₧eme pou₧φt alfanumerickΘ znaky a podtr₧φtko).</p>
  57. <p>TakzvanΘ <em>pojmenovanΘ subv²razy</em> (named subpatterns) m∙₧eme vyu₧φt p°i pou₧itφ funkce <code>preg_match()</code> ve tvaru <samp>preg_match($re,$str,$matched)</samp>, kde <samp>$matched</samp> je pole °et∞zc∙, kterΘ odpovφdajφ jednotliv²m subv²raz∙m. Toto pole je (jak jsme si °ekli ji₧ d°φve) standardn∞ indexovßno Φφsly jednotliv²ch subv²raz∙. Pokud vÜak n∞kterΘ subv²razy pojmenujeme, bude pole obsahovat i prvky s indexy odpovφdajφcφmi t∞mto pojmenovßnφm. Pro pojmenovßnφ subv²razu se pou₧φvß konstrukce <samp>(?P<jmeno>v²raz)</samp>.</p>
  58. <p>Podφvejme se na modelov² p°φklad, v n∞m₧ mßme za ·kol otestovat, zda zadan² °et∞zec (datum) odpovφdß formßtu <samp>RRRR-MM-DD</samp> (p°iΦem₧ prvnφ dvojΦφslφ roku smφ b²t pouze <samp>19</samp> nebo <samp>20</samp>), a pokud odpovφdß, zobrazit jednotlivΘ Φßsti data (den, m∞sφc, rok).</p>
  59.  
  60. <div class='sample'>
  61. $re="/^(?P<rok>(?:19|20)[0-9]{2})-(?P<mesic>[0-9]{2})-(?P<den>[0-9]{2})$/";
  62. <br />$str="2005-07-12";
  63. <br />$result=preg_match($re,$str,$matched);
  64. <br />if($result) //zadan² °et∞zec regulßrnφmu v²razu odpovφdß
  65. <br />{
  66. <br />  echo "Den: ".$matched["den"]."\n";
  67. <br />  echo "M∞sφc: ".$matched["mesic"]."\n";
  68. <br />  echo "Rok: ".$matched["rok"]."\n";
  69. <br />}
  70. <br />else //zadan² °et∞zec regulßrnφmu v²razu neodpovφdß
  71. <br />{
  72. <br />  echo "èpatn² formßt data.";
  73. <br />};
  74. </div>
  75.  
  76. <p>Rozeberme si nejd°φve samotn² regulßrnφ v²raz. Tento v²raz je slo₧en ze t°φ subv²raz∙ (pro rok, m∞sφc a den) tvo°φcφch zp∞tnΘ reference, kterΘ jsou odd∞leny obyΦejn²m znakem pomlΦky. Prvnφ subv²raz <samp>(?P<rok>(?:19|20)[0-9]{2})</samp> je slo₧en z pojmenovßnφ subv²razu <samp>?P<rok></samp>, dßle z uzßvorkovßnφ netvo°φcφho zp∞tnou referenci <samp>(?:19|20)</samp> a nakonec ze skupiny znak∙ <samp>[0-9]</samp> nßsledovanΘ kvantifikßtorem <samp>{2}</samp> (poslednφ dvojΦφslφ roku). Druh² subv²raz <samp>(?P<mesic>[0-9]{2})</samp> se sklßdß op∞t z pojmenovßnφ subv²razu <samp>?P<mesic></samp>, za nφm₧ nßsleduje samotn² v²raz <samp>[0-9]{2}</samp> popisujφcφ dvojcifernΘ Φφslo. T°etφ subv²raz je s druh²m a₧ na pojmenovßnφ shodn².</p>
  77. <p>V²Üe uveden² regulßrnφ v²raz nenφ zcela dokonal², zßm∞rn∞ jsem jej pro ·Φely demonstrace probφran²ch princip∙ zjednoduÜil. Regulßrnφmu v²razu <samp>[0-9]{2}</samp> toti₧ nap°φklad odpovφdß i sekvence znak∙ <samp>00</samp>. Krom toho regulßrnφ v²raz mß popisovat m∞sφc (respektive den v m∞sφci), tak₧e nap°φklad Φφslo <samp>56</samp> by takΘ nem∞lo b²t pova₧ovßno za sprßvn² vstup. DokonalejÜφm °eÜenφm jist∞ bude v²raz <samp>^(?P<rok>(?:19|20)[0-9]{2})-(?P<mesic>0[1-9]|1[0-2])-(?P<den>0[1-9]|[12][0-9]|3[01])$</samp>. Zde je pro popis m∞sφce pou₧ito <samp>0[1-9]|1[0-2]</samp> (mφsto p∙vodnφho <samp>[0-9]{2}</samp>) a pro popis dne v m∞sφci <samp>0[1-9]|[12][0-9]|3[01]</samp> (mφsto p∙vodnφho <samp>[0-9]{2}</samp>).</p>
  78. <p>Vra¥me se nynφ jeÜt∞ na skok k poli <samp>$matched</samp>, kterΘ obsahuje °et∞zce odpovφdajφcφ jednotliv²m subv²raz∙m, a podφvejme se, co ve skuteΦnosti v naÜem p°φkladu obsahuje. K zobrazenφ obsahu pole jsme pou₧ili p°φkaz <samp>var_dump($matched)</samp>.</p>
  79.  
  80. <div class='sample'>
  81. array(7) {
  82. <br />  [0]=>
  83. <br />  string(10) "2004-07-12"
  84. <br />  ["rok"]=>
  85. <br />  string(4) "2004"
  86. <br />  [1]=>
  87. <br />  string(4) "2004"
  88. <br />  ["mesic"]=>
  89. <br />  string(2) "07"
  90. <br />  [2]=>
  91. <br />  string(2) "07"
  92. <br />  ["den"]=>
  93. <br />  string(2) "12"
  94. <br />  [3]=>
  95. <br />  string(2) "12"
  96. <br />}
  97. </div>
  98.  
  99. <p>Jak vidφme, pole nemß Φty°i prvky, jak bychom mohli oΦekßvat, ale sedm prvk∙. Pokud toti₧ pou₧ijeme pojmenovanΘ subv²razy, hodnota odpovφdajφcφ subv²razu se do pole ulo₧φ dvakrßt. Jednou s indexem odpovφdajφcφm Φφslu subv²razu, podruhΘ s indexem (klφΦem) odpovφdajφcφm pojmenovßnφ subv²razu.</p>
  100.  
  101. <h3>Komentß°e</h3>
  102. <p>Pokud mßme slo₧it∞jÜφ regulßrnφ v²raz, m∙₧eme do n∞j (i na n∞kolik mφst) vlo₧it vysv∞tlujφcφ komentß°e. Jedna mo₧nost, jak p°idat komentß°e, byla popsßna v p°edchozφm Φlßnku (pou₧itφ modifikßtoru "extended"). Druhou mo₧nostφ je vlo₧enφ specißlnφ konstrukce ve tvaru <samp>(?#<em>komentß°</em>)</samp> do regulßrnφho v²razu. Regulßrnφmu v²razu <samp>^a(?#m∙j komentß°)b$</samp> tak bude vyhovovat prßv∞ a pouze °et∞zec <samp>ab</samp>, proto₧e za komentß° se pova₧ujφ vÜechny znaky mezi <samp>(?#</samp> a <samp>)</samp>.</p>
  103.  
  104. <div id='article-author'>
  105. <a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/autor.asp?author=244'>Pecka, Miroslav</a> (6. 4. 2005)
  106.  
  107. </div>
  108.  
  109. <div class='refer'><h3><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/serial.asp?serial=218' title='p°ehled Φlßnk∙ vΦetn∞ anotacφ'>Perl-compatible regulßrnφ v²razy v PHP</a></h3><p>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!</p><ul><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3877'>Perl-compatible regulßrnφ v²razy v PHP - tvrzenφ v praxi, podmφn∞nΘ subv²razy</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3859'>Perl-compatible regulßrnφ v²razy v PHP - lokßlnφ modifikßtory, tvrzenφ</a></li><li><strong>Perl-compatible regulßrnφ v²razy v PHP - specißlnφ typy uzßvorkovßnφ</strong> (prßv∞ Φtete)</li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3824'>Perl-compatible regulßrnφ v²razy v PHP - modifikßtory a lφnΘ kvantifikßtory</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3806'>Perl-compatible regulßrnφ v²razy v PHP - hranice</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3792'>Perl-compatible regulßrnφ v²razy v PHP - subv²razy a zp∞tnß reference</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3776'>Perl-compatible regulßrnφ v²razy v PHP - praktickΘ p°φklady</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3758'>Perl-compatible regulßrnφ v²razy v PHP - zßkladnφ konstrukce</a></li></ul></div>
  110.  
  111.  
  112. </div></div>
  113. <div id='page-right'><h2 class='textversion'>Prav² sloupek</h2>
  114. <div id='search'><h3 class='textversion'>Vyhledßvßnφ</h3><form method='get' action='http://interval.cz/search.asp'><div><input type='text' name='hledej' class='text' /><input type='submit' class='submit' value='Najdi!' /></div></form><div><a href='http://interval.cz/search_ex.asp'>RozÜφ°enΘ vyhledßvßnφ</a></div></div>
  115.  
  116.  
  117.  
  118. <div class='page-right-box book'>
  119.     <h3>Kni₧nφ novinka</h3>
  120.     <div class='page-right-box-in'>
  121.         <div class='book-top'>
  122.             <h4><a href='http://interval.cz/__redirect/redirect.asp?what=interval_booknews&url=http://interval.inshop.cz/inshop/scripts/detail.asp?ItemID=290'>PHP - moduly, rozÜφ°enφ a akcelerßtory</a></h4>
  123.         </div>
  124.         <div class='image'>
  125.             <img src='podklady/knihy/image.jpg' alt='obßlka' title='obßlka' /></a>
  126.         </div>
  127.         <div class='book-bottom'>Cena: <span class='book-price-old'>299 KΦ</span> <span class='book-price-new'>269 KΦ</span></div>
  128.     </div>
  129. </div>
  130.  
  131.  
  132.  
  133. <div class='page-right-box reading'><h3 title='NejΦten∞jÜφ Φlßnky za poslednφch 14 dn∙'>NejΦten∞jÜφ</h3><div class='page-right-box-in'><ul><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3863'>Firefox - od webdesignu po tuning</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3861'>Kdo si J2ME, nezlobφ - ·vod pro ka₧dΘho</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3862'>Multimetoda a Java</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3877'>Perl-compatible regulßrnφ v²razy v PHP - tvrzenφ v praxi, podmφn∞nΘ subv²razy</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3878'>Novß ekonomika a globßlnφ informaΦnφ spoleΦnost</a></li></ul></div></div><div class='page-right-box cauldron'><h3 title='Nejdiskutovan∞jÜφ Φlßnky za poslednφch 21 dn∙'>Diskuznφ kotel</h3><div class='page-right-box-in'><ul><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3863' title='(25 komentß°∙)'>Firefox - od webdesignu po tuning</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3484' title='(17 komentß°∙)'>OhleduplnΘ otevφrßnφ nov²ch oken s JavaScriptem</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3861' title='(5 komentß°∙)'>Kdo si J2ME, nezlobφ - ·vod pro ka₧dΘho</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3877' title='(4 komentß°∙)'>Perl-compatible regulßrnφ v²razy v PHP - tvrzenφ v praxi, podmφn∞nΘ subv²razy</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3859' title='(2 komentß°∙)'>Perl-compatible regulßrnφ v²razy v PHP - lokßlnφ modifikßtory, tvrzenφ</a></li></ul></div></div>
  134.  
  135.  
  136.  
  137. <div class='page-right-box emailserv'><h3>Email servis</h3><div class='page-right-box-in'><form action='prihlaseni.asp' method='post'><div class='shell'><input class='text' type='text' name='adresa' /></div><div class='shell'><input class='radio' type='radio' value='1' name='co' checked='checked' />T²dennφ p°ehled Φlßnk∙</div><div class='shell'><input class='radio' type='radio' value='2' name='co' />HELP konference</div><div class='shell'><input class='submit' type='submit' value='P°ihlßsit' /></div></form></div></div>
  138. </div>
  139. <div class='page-maker'> </div><div class='page-maker-white'> </div></div>
  140. <div id='page-foot'><div id='page-foot-menu'><a href='http://interval.cz/reklama.asp'>Inzerce na Interval.cz</a> | <a href='http://interval.cz/redakce.asp'>Redakce Interval.cz</a> | <a href='http://interval.cz/autori.asp'>Hledßme novΘ autory</a></div><div id='issn'>ISSN 1212-8651</div><div id='page-foot-zoner'>© Zoner software, s.r.o., vÜechna prßva vyhrazena, tento server dodr₧uje <a href='http://interval.cz/privacy.asp'>prßvnφ p°edpisy</a>o ochran∞ osobnφch ·daj∙.</div></div>
  141. </body>
  142. </html>