<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog Mintdesign &#187; regularne</title>
	<atom:link href="http://blog.mintdesign.pl/tag/regularne/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.mintdesign.pl</link>
	<description>Blog poświęcony tematyce tworzenia stron internetowych.</description>
	<lastBuildDate>Mon, 09 May 2011 18:46:48 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Wyrażenia regularne cz. 1</title>
		<link>http://blog.mintdesign.pl/php/wyrazenia-regularne-cz-1.html</link>
		<comments>http://blog.mintdesign.pl/php/wyrazenia-regularne-cz-1.html#comments</comments>
		<pubDate>Thu, 11 Feb 2010 22:53:48 +0000</pubDate>
		<dc:creator>Virus</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[regularne]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[wyrażenia]]></category>
		<category><![CDATA[wyrażenia regularne]]></category>

		<guid isPermaLink="false">http://blog.mintdesign.pl/?p=460</guid>
		<description><![CDATA[Wyrażenia regularne są łańcuchami znaków, które pomagają w odnajdywaniu w tekście różnych wzorców. Są nieocenioną pomocą w przypadku, gdy trzeba np. sprawdzić poprawność składniową adresu e-mail czy też wyodrębnić z tekstu ciąg wielkich liter o zadanej długości. Praktyczne zastosowania wyrażeń regularnych można mnożyć w nieskończoność &#8211; wszystko sprowadza się do porównania łańcucha znaków z zadanym [...]]]></description>
			<content:encoded><![CDATA[<p>Wyrażenia regularne są łańcuchami znaków, które pomagają w odnajdywaniu w tekście różnych wzorców. Są nieocenioną pomocą w przypadku, gdy trzeba np. sprawdzić poprawność składniową adresu e-mail czy też wyodrębnić z tekstu ciąg wielkich liter o zadanej długości. Praktyczne zastosowania wyrażeń regularnych można mnożyć w nieskończoność &#8211; wszystko sprowadza się do porównania łańcucha znaków z zadanym wzorcem i ewentualnym zamienianiu niektórych fragmentów tego wzorca na inne znaki.</p>
<p>Ten tutorial podzielę na dwie części. W pierwszej omówię same wyrażenia regularne, zaś część drugą poświęcę na ich zastosowanie w php. Ograniczę się wyłącznie do PERL-owych wyrażeń, które są alternatywą dla mniej wydajnych i odchodzących z użycia wyrażeń POSIX-owych (część elementów jest wspólna dla jednych i drugich).<br />
<span id="more-460"></span><br />
Aby jednak nie zaciemniać za bardzo przykładów w moim tutorialu, przedstawię w tym momencie najprostszą funkcję do obsługi wyrażeń regularnych w php &#8211; <strong>preg_match()</strong>. Jej najprostsza składnia przedstawia się następująco:</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$czy_pasuje</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$wyrazenie</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ciag</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Funkcja ta posiada dodatkowe parametry, o których wspomnę w dalszej części tutoriala. Należy również zaznaczyć, że wyrażenia używane w tej funkcji muszą zaczynać się i kończyć jednym dowolnym (oprócz backslasha) znakiem niealfanumerycznym, który musi być następnie unikany backslashem wewnątrz wyrażenia. Przyjęło się, że jest to slash, jednak w przypadku wyrażenia z dużą ilością slashów wewnątrz (np. adresy http) można zastosować inny, np. #.</p>
<h2>Podstawy</h2>
<p>Tak naprawdę każdy tekst nie zawierający znaków specjalnych jest wyrażeniem regularnym. Zwyczajne</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Ala ma kota</div></td></tr></tbody></table></div>
<p>jest wyrażeniem regularnym, do którego pasuje tekst <strong>Słyszałem, że Ala ma kota.</strong>. Warto zaznaczyć, że wyrażenia regularne są wrażliwe na wielkość liter. Oczywiście stosowanie samych takich ciągów jako wyrażeń mija się z celem. Skomplikujmy nieco nasze wyrażenie.</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Ala ma (kota|psa)</div></td></tr></tbody></table></div>
<p>Tutaj nawias służy nam do zgrupowania wyrazów, które mogą pojawić się w tym miejscu. Wyrazy oddzielone są pionową kreską. W związku z tym powyższe wyrażenie pasuje zarówno do <strong>Ala ma kota</strong> jak i <strong>Ala ma psa</strong>. Gdybyśmy potrzebowali w którymś z wyrazów użyć nawiasu lub pionowej kreski, powinniśmy uniknąć ich przetworzenia za pomocą backslasha. Oto lista wszystkich znaków specjalnych, które muszą zostać poprzedzone backslashem, gdy mają być traktowane jako zwykły tekst.</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">^ $ &lt; &gt; ( ) [ { . * ? + | \</div></td></tr></tbody></table></div>
<p>Oczywiście nie byłoby potrzeby unikania powyższych znaków, gdyby każdy z nich nie służył specjalnemu celowi. I tak na przykład, znak <strong>^</strong> służy do dopasowania wyrażenia do początku łańcucha, natomiast <strong>$</strong> do jego końca.</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'moje ulubione danie to placki'</span><span style="color: #339933;">;</span><br />
<a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/placki/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// zwróci true;</span><br />
<a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/placki$/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// zwróci true;</span><br />
<a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/^placki/'</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// zwróci false;</span></div></td></tr></tbody></table></div>
<p>Oczywiście gdy nasze wyrażenie będzie brzmiało &#8220;^placki$&#8221;, jedynym spełniającym go tekstem będzie słowo placki. Takie zastosowanie wyrażeń nie ma jednak sensu &#8211; dużo wydajniejsze jest użycie zwykłego porównania.</p>
<p>Jeśli chcemy sprawdzić, czy w danym miejscu w tekście występuje jeden z kilku możliwych znaków, używamy do tego nawiasów kwadratowych. W nawiasach tych możemy zastosować zakres &#8211; np. a-e, 0-9, A-Z. Nie ma potrzeby unikania znaku -, ponieważ zakres jest sprawdzany wyłącznie tam, gdzie to ma sens, np. między dwiema małymi, dwiema wielkimi literami lub między dwiema cyframi. Istnieje również możliwość zaprzeczenia podanemu zakresowi, stawiając znak <strong>^</strong> zaraz po lewym nawiasie kwadratowym. Przykłady:</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/[aeiou]/'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'fasola'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// zwróci true - w łańcuchu znajdują się te samogłoski;</span><br />
<a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/[A-Z]/'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'fasola'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// zwróci false - w łańcuchu nie ma żadnych wielkich liter;</span><br />
<a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/[^0-9.-]/'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'100 zł'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// zwróci true - w łańcuchu znajdują się znaki spoza podanego zakresu</span></div></td></tr></tbody></table></div>
<p>Czasem lepszym rozwiązaniem od użycia kilku zakresów naraz jest zastosowanie znaków specjalnych, reprezentujących szczególne grupy znaków. Oto najczęściej używane znaki specjalne:</p>
<table border="0">
<tbody>
<tr>
<td>Znak</td>
<td>Odpowiednik</td>
<td>Opis</td>
</tr>
<tr>
<td>.</td>
<td>(brak)</td>
<td>Dowolny znak</td>
</tr>
<tr>
<td>\s</td>
<td>[\t\r\n ]</td>
<td>Białe spacje</td>
</tr>
<tr>
<td>\S</td>
<td>[^\t\r\n ]</td>
<td>Wszystko oprócz białych spacji</td>
</tr>
<tr>
<td>\d</td>
<td>[0-9]</td>
<td>Cyfry</td>
</tr>
<tr>
<td>\D</td>
<td>[^0-9]</td>
<td>Wszystko oprócz cyfr</td>
</tr>
<tr>
<td>\w</td>
<td>[a-zA-Z0-9_]</td>
<td>Znaki stanowiące słowa</td>
</tr>
<tr>
<td>\W</td>
<td>[^a-zA-Z0-9_]</td>
<td>Domyśl się <img src='http://blog.mintdesign.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </td>
</tr>
</tbody>
</table>
<h2>Kwantyfikatory</h2>
<p>Aby móc sprawdzić, czy litera B znajduje się w wyrażeniu pięć (lub pięćset pięć) razy, nie ma sensu jej tam aż tyle pisać. Wystarczy użyć odpowiedniego kwantyfikatora. Używa się ich również do sprawdzenia, czy dany znak występuje raz albo w ogóle, co najmniej zero razy, co najmniej raz czy też od tylu do tylu razy. A oto one:</p>
<table border="0">
<tbody>
<tr>
<td>Wyrażenie</td>
<td>Pasujące łańcuchy</td>
<td>Wyjaśnienie</td>
</tr>
<tr>
<td>^a<strong>?</strong>$</td>
<td>&#8221;, &#8216;a&#8217;</td>
<td>Zero lub jeden raz</td>
</tr>
<tr>
<td>^a<strong>*</strong>$</td>
<td>&#8221;, &#8216;a&#8217;, &#8216;aa&#8217;, &#8216;aaa&#8217;&#8230;</td>
<td>Co najmniej zero razy</td>
</tr>
<tr>
<td>^a<strong>+</strong>$</td>
<td>&#8216;a&#8217;, &#8216;aa&#8217;, &#8216;aaa&#8217;&#8230;</td>
<td>Co najmniej raz</td>
</tr>
<tr>
<td>^a<strong>{7}</strong>$</td>
<td>&#8216;aaaaaaa&#8217;</td>
<td>Dokładnie 7 razy</td>
</tr>
<tr>
<td>^a<strong>{4,7}</strong>$</td>
<td>&#8216;aaaa&#8217;, &#8216;aaaaa&#8217;, &#8216;aaaaaa&#8217;, &#8216;aaaaaaa&#8217;</td>
<td>Od 4 do 7 razy</td>
</tr>
<tr>
<td>^a<strong>{4,}</strong>$</td>
<td>&#8216;aaaa&#8217;, &#8216;aaaaa&#8217;, &#8216;aaaaaa&#8217;&#8230;</td>
<td>Co najmniej cztery razy</td>
</tr>
<tr>
<td>^a<strong>{,4}</strong>$</td>
<td>&#8221;, &#8216;a&#8217;, &#8216;aa&#8217;, &#8216;aaa&#8217;, &#8216;aaaa&#8217;</td>
<td>Co najwyżej cztery razy</td>
</tr>
</tbody>
</table>
<p>Oczywiście kwantyfikatory działają również dla całych grup znaków, zarówno tych pogrupowanych za pomocą nawiasów kwadratowych jak i tych z oznaczeniami z poprzedniej tabeli. Przykładowo, <strong>\w+</strong> oznacza co najmniej jeden znak będący częścią słowa, natomiast <strong>[0-5]{2}</strong> oznacza dwie sąsiadujące ze sobą cyfry z zakresu od 0 do 5.</p>
<h2>Przykłady</h2>
<p>Przebrnąłeś już przez trochę suchej teorii &#8211; czas na sensowniejsze przykłady. Pamiętasz Alę z początku tutoriala? Gdyby między słowami znajdowała się więcej niż jedna spacja, to mimo iż treść jest wciąż taka sama, dla skryptu jest diametralnie różna. Nauczmy więc parsera uznawać więcej niż jedną spację między słowami, tworząc takie wyrażenie:</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$expr</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/Ala\s+ma\s+kota/'</span><span style="color: #339933;">;</span><br />
<a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$expr</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Ala &nbsp; ma kota'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// zwróci true</span><br />
<a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$expr</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' Ala &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ma &nbsp; &nbsp; &nbsp; &nbsp; kota'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// też zwróci true</span><br />
<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Ala<br />
<br />
ma<br />
kota'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// puste linie są częścią łańcucha znaków!</span><br />
<a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$expr</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// też zwróci true</span><br />
<a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$expr</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Ala nie ma kota'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// zwróci false</span></div></td></tr></tbody></table></div>
<p>A co, gdybyśmy chcieli, by wyrażenie było prawdziwe zarówno gdy ma kota, jak i go nie ma? Zmodyfikujmy nasze wyrażenie następująco:</p>
<div class="codecolorer-container php dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$expr</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/Ala\s+(nie\s+)?ma\s+kota/'</span><span style="color: #339933;">;</span><br />
<a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$expr</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Ala &nbsp;ma kota'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// true</span><br />
<a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$expr</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Ala &nbsp; &nbsp; nie &nbsp;ma kota'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// true</span><br />
<a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$expr</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ala NIE ma kota!!!11'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// false - wielkość liter ma znaczenie</span></div></td></tr></tbody></table></div>
<p>Zostawmy Alę już na dobre i zajmijmy się czymś, co prędzej zastosujemy na naszych stronach. Załóżmy, że chcemy, aby użytkownicy przysyłali nam obrazy &#8211; obrazy te mają jednak mieć nazwy w formacie <em>obraz_xxx</em> (gdzie xxx to jakaś liczba) i mogą mieć rozszerzenie jpg, gif lub png. Wyrażenie, które nam pomoże w sprawdzeniu nazwy, wyglądać będzie następująco:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/^obraz_\d+\.(jpg|gif|png)$/</div></td></tr></tbody></table></div>
<p><strong>Krótka analiza</strong>:<br />
Przede wszystkim nazwa pliku musi zaczynać się od słowa obraz &#8211; umieszczamy więc znak <strong>^</strong> i piszemy po nim obraz. Następnie po znaku podkreślenia znajduje się dowolna ilość cyfr, o czym mówi nam znak <strong>\d</strong> z kwantyfikatorem <strong>+</strong> (co najmniej jedna). Następnie w nazwie pliku musi znajdować się kropka &#8211; w wyrażeniu musimy uniknąć ją backslashem, w przeciwnym wypadku kropka zastąpiłaby nam dowolny znak. Następnie stosujemy alternatywę trzech rozszerzeń, po których nasze wyrażenie musi się kończyć, o czym informuje znak dolara.</p>
<p><strong>Inny przykład</strong> &#8211; mamy profil użytkownika, w którym może on wpisać adres swojej strony www. Stajemy przed dwoma problemami: czy użytkownik wpisał <em>http://</em> na początku swojego adresu? (jeśli nie, należy to dokleić przy generowaniu linka do jego strony) czy użytkownik wpisał poprawny adres www? (zakładamy, że dopuszczamy jedynie &#8220;typowe adresy&#8221;, jak np. <em>www.onet.pl</em>, a nie <em>www.strona.pl/cos.php?a=b%3B</em>&#8230;itd.)<br />
<strong>Pierwsze wyrażenie</strong> jest bardzo proste i nie robi nic więcej oprócz odpowiedzi na pierwsze pytanie:</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">preg_match('#^http://#', $adres_strony);</div></td></tr></tbody></table></div>
<p><strong>Drugie wyrażenie</strong> będzie bardziej skomplikowane. Uwzględnijmy w nim, że wewnątrz adresu nie mogą znajdować się inne znaki niż alfanumeryczne, kropka, myślnik czy znak podkreślenia oraz przypilnujmy, by domena najwyższego poziomu nie była zbyt długa. Adres może, ale nie musi zaczynać się od <em>http://</em>.</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#^(http://)?([a-zA-Z0-9][a-zA-Z0-9_-]*[a-zA-Z0-9]\.)+[a-z]{2,4}/?$#</div></td></tr></tbody></table></div>
<p>Straszne? Wiem. Przeanalizujmy to wyrażenie. Na początku sprawdzamy, czy <em>http://</em> występuje najwyżej raz za pomocą kwantyfikatora <strong>?</strong>. Słowo <em>http://</em> musimy wziąć w nawias, w przeciwnym wypadku znak zapytania stosowałby się wyłącznie do pojedynczego slasha. Następnie mamy kolejny nawias &#8211; grupę kolejnych subdomen, z których każda kończy się kropką. Kropkę w nawiasie koniecznie unikamy, jeśli nie chcemy, aby została przetworzona jako dowolny znak. Na początku i na końcu subdomeny mogą znajdować się wyłącznie litery i cyfry, a w środku dowolna ilość znaków ze środkowego nawiasu kwadratowego. Uwaga: zakładamy, że kolejne subdomeny mają przynajmniej dwa znaki długości. Po ostatniej kropce mogą wystąpić od dwóch do czterech małych liter jako domena najwyższego poziomu. Opcjonalnie na końcu adresu może znajdować się slash.</p>
<p>W tej części to już tyle. Następna pojawi się za tydzień i omówię w niej najistotniejsze funkcje PHP obsługujące wyrażenia regularne, a także bardziej zaawansowane konstrukcje w samych wyrażeniach. Żeby wam się specjalnie nie nudziło, mam dla was cztery ćwiczenia. Odpowiedzi możecie zostawiać tutaj w komentarzach lub w odpowiednim dziale na forum.</p>
<p><strong>A oto ćwiczenia</strong>:</p>
<ol>
<li>Numer telefonu w postaci xxx-xxx-xxx, z opcjonalnym numerem kierunkowym kraju na początku (np. 123-456-789, +48 666 666 666)</li>
<li>Adres filmiku na youtube &#8211; zwrócić uwagę na składnię linku do filmiku, dopuszczalne znaki w jego identyfikatorze i ich ilość. Zakładamy, że chodzi o najprostszy link, bez dodatkowych parametrów typu feature=related w adresie.</li>
<li>Adres e-mail. Chyba każdemu się przyda. Nie googlać, będę umiał rozpoznać wygooglane <img src='http://blog.mintdesign.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li>Zmodyfikować przykład z adresem www tak, aby dopuszczał również jednoliterowe (lub jednocyfrowe) subdomeny.</li>
</ol>
<ul class="related_post"><li><a href="http://blog.mintdesign.pl/php/dlaczego-warto-uzywac-stalych.html" title="Dlaczego warto używać stałych?">Dlaczego warto używać stałych?</a> (2)</li><li><a href="http://blog.mintdesign.pl/photoshop/videotutorial-realistyczny-napis-3d.html" title="[Videotutorial] Realistyczny napis 3D">[Videotutorial] Realistyczny napis 3D</a> (5)</li><li><a href="http://blog.mintdesign.pl/photoshop/tutorial-button-w-stylu-mac-os.html" title="[Tutorial] Button w stylu &#8216;Mac OS&#8217;">[Tutorial] Button w stylu &#8216;Mac OS&#8217;</a> (2)</li><li><a href="http://blog.mintdesign.pl/photoshop/tutorial-realistyczny-napis-3d.html" title="[Tutorial] Realistyczny napis 3D">[Tutorial] Realistyczny napis 3D</a> (2)</li><li><a href="http://blog.mintdesign.pl/photoshop/tutorial-szklane-menu.html" title="[Tutorial] Szklane menu">[Tutorial] Szklane menu</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.mintdesign.pl/php/wyrazenia-regularne-cz-1.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

