home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 May / PCWorld_2005-05_cd.bin / novinky / Interval / clanek10.htm < prev    next >
Encoding:
Extensible Markup Language  |  2005-04-02  |  17.2 KB  |  149 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 - modifikßtory a lφnΘ kvantifikßtory -- 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 - modifikßtory a lφnΘ kvantifikßtory</h2>
  38. <p id='prepend'>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.</p>
  39.  
  40. <h3>"Single line"</h3>
  41. <p>Jak jsem psal ji₧ <a href='http://interval.cz/clanek.asp?article=3758' title='Pecka, Miroslav: Perl-compatible regulßrnφ v²razy v PHP - zßkladnφ konstrukce'>v prvnφm Φlßnku</a>, metaznaku <samp>.</samp> (teΦka) odpovφdajφ vÜechny znaky krom∞ <samp>\n</samp>. Pokud je vÜak pou₧it modifikßtor "single line" (kter² mß ovÜem v PHP internφ oznaΦenφ "PCRE_DOTALL"), metaznak <samp>.</samp> bude odpovφdat i znaku konce °ßdku <samp>\n</samp>. Modifikßtor "single line" mß zkratku "s".</p>
  42.  
  43. <h3>"Extended" aneb komentß°e v regulßrnφch v²razech</h3>
  44. <p>Pokud pou₧ijeme modifikßtor "extended" (kter² mß zkratku "x"), zp∙sobφ to dv∞ zm∞ny ve vyhodnocovßnφ regulßrnφho v²razu:</p>
  45.  
  46. <ol>
  47. <li>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 <samp>\</samp>.</li>
  48. <li>╚ßst regulßrnφho v²razu vpravo od znaku <samp>#</samp> a₧ po znak konce °ßdku <samp>\n</samp> (vΦetn∞) bude ignorovßna. To umo₧≥uje vklßdat ve slo₧it²ch regulßrnφch v²razech komentß°e za znak <samp>#</samp>.</li>
  49. </ol>
  50.  
  51. <p>Pou₧itφ p°edvedu op∞t na ukßzce:</p>
  52.  
  53. <div class='sample'>
  54. $re="/^ ah\n\toj$#m∙j vlastnφ komentß°/x";
  55. <br />$str="ahoj";
  56. <br />preg_match($re,$str); //vrßtφ int(1), tedy shodu
  57. </div>
  58.  
  59. <p>V uvedenΘm regulßrnφm v²razu jsou obsa₧eny jak bφlΘ znaky <samp> </samp> (mezera), <samp>\n</samp>, <samp>\t</samp>, tak i text komentß°e (<samp>#m∙j vlastnφ komentß°</samp>), kter² bude zcela ignorovßn.</p>
  60.  
  61. <h3>"Evaluate" - specißlnφ modifikßtor p°i nahrazovßnφ</h3>
  62. <p>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 <code>preg_replace()</code> (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 <samp>$replacement</samp>) 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).</p>
  63.  
  64. <div class='sample'>
  65. $re="/(<\/?)([a-z]+)([^>]*>)/ei";
  66. <br />$replacement="'\\1'.strtolower('\\2').'\\3'";
  67. <br />$str="<H1>Nadpis</H1>
  68. <br /><P>Text1</P>
  69. <br /><P>Text1</P>";
  70. <br />$result=preg_replace($re,$replacement,$str);
  71. </div>
  72.  
  73. <p>V²sledkem (obsahem prom∞nnΘ <samp>$result</samp>) pak je HTML k≤d:</p>
  74.  
  75. <div class='sample'>
  76. <h1>Nadpis</h1>
  77. <br /><p>Text1</p>
  78. <br /><p>Text1</p>
  79. </div>
  80.  
  81. <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Φ <samp>/</samp> (na po°adφ zßpisu modifikßtor∙ p°itom nezßle₧φ).</p>
  82. <p>Regulßrnφmu v²razu v prom∞nnΘ <samp>$re</samp> 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ß <samp><</samp> (otvφracφ tag) nebo <samp></</samp> (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 <samp>></samp>) nßsledovanß znakem <samp>></samp>.</p>
  83. <p>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 (<samp>\\2</samp>) pomocφ PHP funkce <code>strtolower()</code>, kterß p°evßdφ °et∞zec na malß pφsmena. Proto₧e je nynφ (kv∙li modifikßtoru "e") °et∞zec v prom∞nnΘ <samp>$replacement</samp> vyhodnocovßn jako PHP k≤d, musφ b²t zp∞tnΘ reference <samp>\\1</samp> a <samp>\\3</samp> 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 <samp>strtolower('\\2')</samp>) pomocφ b∞₧nΘho PHP operßtoru pro spojovßnφ °et∞zc∙ (<samp>.</samp> - teΦka).</p>
  84.  
  85. <h3>Kvantifikßtory podruhΘ - "lenost" kontra "nenasytnost"</h3>
  86. <p>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 <samp>abbb</samp> s regulßrnφm v²razem <samp>^a(b+)</samp>, pak prvnφmu subv²razu bude odpovφdat °et∞zec <samp>bbb</samp>. Dan² regulßrnφ v²raz by se samoz°ejm∞ "spokojil" (p°esn∞ji °eΦeno "by odpovφdal") i s °et∞zcem <samp>ab</samp>, 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).</p>
  87. <p>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 <samp>abbb</samp> a regulßrnφ v²raz <samp>^a(b+)</samp>, prvnφmu subv²razu bude odpovφdat jednoznakov² °et∞zec <samp>b</samp>. Zbytek °et∞zce bude ignorovßn (nep°ehlΘdn∞te, ₧e je pou₧ito pouze ukotvenφ za zaΦßtku pomocφ <samp>^</samp> - vpravo od prvnφho v²skytu <samp>b</samp> a₧ do konce °et∞zce tak m∙₧e b²t cokoli).</p>
  88. <p>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 (<samp>?</samp>).</p>
  89. <p>Mφsto kvantifikßtor∙ <samp>?</samp>, <samp>*</samp>, <samp>+</samp>, <samp>{<em>m</em>,<em>n</em>}</samp>, <samp>{<em>m</em>,}</samp> (kde <em>m</em> je minimßlnφ poΦet v²skyt∙ a <em>n</em> je maximßlnφ poΦet v²skyt∙ - vφce viz prvnφ Φlßnek), m∙₧eme pou₧φt jejich lφnΘ varianty <samp>??</samp>, <samp>*?</samp>, <samp>+?</samp>, <samp>{<em>m</em>,<em>n</em>}?</samp>, <samp>{<em>m</em>,}?</samp>. </p>
  90. <p>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 <samp>bbbbbb</samp> bude odpovφdat (vytvß°et shodu) jednotliv²m regulßrnφm v²raz∙m.</p>
  91.  
  92. <div class='table'>
  93. <table cellspacing='0'>
  94. <tr><th>Regulßrnφ v²raz</th><th>Shoda</th></tr>
  95. <tr><td>b?</td><td>b</td></tr>
  96. <tr><td>b??</td><td>(prßzdn² °et∞zec)</td></tr>
  97. <tr><td>b*</td><td>bbbbbb</td></tr>
  98. <tr><td>b*?</td><td>(prßzdn² °et∞zec)</td></tr>
  99. <tr><td>b+</td><td>bbbbbb</td></tr>
  100. <tr><td>b+?</td><td>b</td></tr>
  101. <tr><td>b{2, 4}</td><td>bbbb</td></tr>
  102. <tr><td>b{2, 4}?</td><td>bb</td></tr>
  103. <tr><td>b{3,}</td><td>bbbbbb</td></tr>
  104. <tr><td>b{3,}?</td><td>bbb</td></tr>
  105. <tr><td>b{5}</td><td>bbbbb</td></tr>
  106. </table>
  107. </div>
  108.  
  109. <p>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Θ".</p>
  110.  
  111. <div id='article-author'>
  112. <a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/autor.asp?author=244'>Pecka, Miroslav</a> (22. 3. 2005)
  113.  
  114. </div>
  115.  
  116. <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><strong>Perl-compatible regulßrnφ v²razy v PHP - modifikßtory a lφnΘ kvantifikßtory</strong> (prßv∞ Φtete)</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>
  117.  
  118.  
  119. </div></div>
  120. <div id='page-right'><h2 class='textversion'>Prav² sloupek</h2>
  121. <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>
  122.  
  123.  
  124.  
  125. <div class='page-right-box book'>
  126.     <h3>Kni₧nφ novinka</h3>
  127.     <div class='page-right-box-in'>
  128.         <div class='book-top'>
  129.             <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>
  130.         </div>
  131.         <div class='image'>
  132.             <img src='podklady/knihy/image.jpg' alt='obßlka' title='obßlka' /></a>
  133.         </div>
  134.         <div class='book-bottom'>Cena: <span class='book-price-old'>299 KΦ</span> <span class='book-price-new'>269 KΦ</span></div>
  135.     </div>
  136. </div>
  137.  
  138.  
  139.  
  140. <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=3829'>Interval.cz a jeho Φtenß°i v roce 2005</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3830'>Pou₧φvßme nßvrhovΘ vzory v .NET - Singleton</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3827'>SUN Java Studio Creator</a></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=3831'>GNU Gettext - sprßva p°eklad∙</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=3818' title='(36 komentß°∙)'>PHP a MS SQL - vklßdßnφ a naΦφtßnφ soubor∙</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3811' title='(26 komentß°∙)'>GNU Gettext - prvnφ kroky</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3829' title='(20 komentß°∙)'>Interval.cz a jeho Φtenß°i v roce 2005</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3815' title='(11 komentß°∙)'>H°φchy pro ÜφlenΘho korektora - jak se vyhnout zbyteΦn²m chybßm</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3825' title='(11 komentß°∙)'>Ovlßdacφ prvok CAPTCHA v ASP.NET</a></li></ul></div></div>
  141.  
  142.  
  143.  
  144. <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>
  145. </div>
  146. <div class='page-maker'> </div><div class='page-maker-white'> </div></div>
  147. <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>
  148. </body>
  149. </html>