<?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>m1chu.eu - another devblog &#187; Ogólne</title>
	<atom:link href="http://m1chu.eu/category/ogolne/feed/" rel="self" type="application/rss+xml" />
	<link>http://m1chu.eu</link>
	<description>we live, as we dream... alone - another devblog</description>
	<lastBuildDate>Sun, 14 Nov 2010 11:07:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>CodeTwister (#2) &#8211; nadszedł czas prostych zagadek programistycznych!</title>
		<link>http://m1chu.eu/2010/09/10/codetwister-2-nadszedl-czas-prostych-zagadek-programistycznych/</link>
		<comments>http://m1chu.eu/2010/09/10/codetwister-2-nadszedl-czas-prostych-zagadek-programistycznych/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 09:57:02 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[CodeTwister]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[arytmetyka]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webmastering]]></category>
		<category><![CDATA[zagadka]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1858</guid>
		<description><![CDATA[Po niespełna dwóch latach pora na kontynuację zabawy. Tym razem poziom wyżej i mieszanka: jedno zadanie dotyczące języka kompilowanego, a drugie skryptowego. A przed tym, rozwiązanie poprzedniej zagadki&#8230; CodeTwister (#1) &#8211; rozwiązanie W listopadzie 2008 roku zamieściłem prosty quiz dotyczący kodu XHTML, CSS i JavaScript. Rozwiązanie opierało się na poprawieniu czterech błędów: W przypadku użycia [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MTBfMDlfMTBfY29kZXR3aXN0ZXIyO2NvZGV0d2lzdGVyMl9wb3N0X2hlYWRlci5wbmc=" style="width: 538px; height: 119px;" alt="brak pluginu Flash" /></p>
<p>Po niespełna dwóch latach pora na kontynuację zabawy. Tym razem poziom wyżej i mieszanka: jedno zadanie dotyczące języka kompilowanego, a drugie skryptowego. A przed tym, rozwiązanie poprzedniej zagadki&#8230;</p>
<p><span id="more-1858"></span></p>
<h2>CodeTwister (#1) &#8211; rozwiązanie</h2>
<p>W listopadzie 2008 roku <a href="http://m1chu.eu/2008/11/04/codetwister-1-nadszedl-czas-prostych-zagadek-programistycznych" >zamieściłem</a> prosty quiz dotyczący kodu <strong>XHTML</strong>, <strong>CSS</strong> i <strong>JavaScript</strong>. Rozwiązanie opierało się na poprawieniu czterech błędów:</p>
<ol>
<li>W przypadku użycia negatywnego komentarza warunkowego <a href="http://m1chu.eu/2008/12/22/haki-css-dla-niepokornego-internet-explorera/" >strona przestaje być prawidłowym dokumentem XHTML</a>. Tym bardziej wewnątrz arkusza stylów. Style przeznaczone dla Internet Explorera powinny więc być umieszczone w ukrytych komentarzach warunkowych lub za pomocą odpowiednich haków.
<pre class="brush: css; title: ;">&lt;![if !IE]&gt;
div#container p {
    color: #ccc;
}
&lt;![endif]&gt;</pre>
</li>
<li>Znacznik <code>comment</code> <a href="http://m1chu.eu/2008/12/22/haki-css-dla-niepokornego-internet-explorera/" >nie jest elementem XHTML</a>.
<pre class="brush: xml; title: ;">&lt;comment&gt;Nie używasz&lt;/comment&gt;</pre>
</li>
<li>Nie można w poniższy sposób dodać elementu z zawartością do jakiegokolwiek potomka <code>body</code> ponieważ kod JavaScript wykonywany jest przed załadowaniem dokumentu XHTML. W celu rozwiązania problemu można wykorzystać m.in. możliwości frameworków, elementu <code>onload</code> albo zdarzeń <code>DOMContentLoaded</code> lub <code>window.onload</code>.
<pre class="brush: jscript; title: ;">&lt;script type=&quot;text/javascript&quot;&gt;
&lt;!--
if ( navigator.appName == &quot;Microsoft Internet Explorer&quot; &amp;&amp; navigator.appVersion.indexOf(&quot;MSIE 7&quot;) &gt; -1 )
{
    var p = document.createElement('p');
    p.appendChild(document.createTextNode(&quot;Wersja silnika IE: &quot; + navigator.appVersion));
    document.body.firstChild.appendChild(p);
}
--&gt;
&lt;/script&gt;</pre>
</li>
<li>Brak wymaganego znacznika title.</li>
</ol>
<p>Najbliżej rozwiązania był więc <a href="http://m1chu.eu/2008/11/04/codetwister-1-nadszedl-czas-prostych-zagadek-programistycznych/#comment-3848" ><strong>gruch4</strong></a>. Gratulacje!</p>
<p>A w nowym pakiecie&#8230;</p>
<h2>Zadanie 1 w PHP: problem ze zwracanym wynikiem</h2>
<p>Wykonujemy poniższy kod PHP:</p>
<pre class="brush: php; title: ;">$zmienna_poczatkowa = 10;
$zmienna_wynikowa = ((~$zmienna_poczatkowa)^(1+8)) &lt;&lt; 2;
var_dump($zmienna_poczatkowa, $zmienna_wynikowa);</pre>
<p>Dlaczego poniższy kod w wyniku zwraca wartość ujemną (int(10) int(-16))? Jak powinna wygląda poprawnie skonstruowana składnia? Jaki będzie wtedy wynik?</p>
<h2>Zadanie 2 w C/C++: błędny kod</h2>
<p>Znajdź błędy w poniższym kodzie C/C++. Czego w nim brakuje?</p>
<pre class="brush: cpp; title: ;">#include &lt;stdio.h&gt;
#include &lt;windows.h&gt; 

#define SIZE 200 

int main()
{
    int *m = malloc(SIZE*sizeof(int)), i;
    char small = 'x', large = 'y';

    for (i = 0; i &lt; SIZE; ++i) {
        if ( !(i % 2) )
            printf(&quot;%s: %d\n&quot;, small, (*(m + i) = i * i));
        else
            printf(&quot;%s: %d\n&quot;, large, (*(m + i) = i * i));
    }

    free(m);

    return 0;
}</pre>
<p>Życzę wszystkim powodzenia! :]</p>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2010/09/10/codetwister-2-nadszedl-czas-prostych-zagadek-programistycznych/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Szybka porada: jak zmusić Internet Explorer 8 i Firefox 2 do obsługi HTML 5? (#1)</title>
		<link>http://m1chu.eu/2010/08/24/szybka-porada-jak-zmusic-internet-explorer-8-i-firefox-2-do-obslugi-html-5-1/</link>
		<comments>http://m1chu.eu/2010/08/24/szybka-porada-jak-zmusic-internet-explorer-8-i-firefox-2-do-obslugi-html-5-1/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 20:38:47 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[(x)HTML]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Pozostałe]]></category>
		<category><![CDATA[Szybka porada]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[createelement]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[firefox 2]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[porada]]></category>
		<category><![CDATA[shiv]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1825</guid>
		<description><![CDATA[Sieć została ogarnięta szałem najnowszej, piątej wersji języka HTML. Jak to zazwyczaj bywa słabo z jej obsługą radzi sobie Internet Explorer. We wszystkich wydanych wersjach pojawia się problem z parsowaniem elementów języka HTML 5, a co za tym idzie nie ma domyślnie możliwości ich poprawnego ostylowania. Podobny problem w przeszłości występował w Firefoksie 2. Zarys [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MjJfMDhfMTBfcXVpY2tfaGludF9pZThfYW5kX2h0bWw1O3F1aWNrX2hpbnRfaWU4X2FuZF9odG1sNV9wb3N0X2hlYWRlci5wbmc=" alt="Jak zmusić Internet Explorer 8 do obsługi HTML 5?" style="height: 119px;" /></p>
<p>Sieć została ogarnięta szałem najnowszej, <a href="http://m1chu.eu/2010/03/19/html5-obsluga-elementow-audio-i-video/" >piątej wersji języka HTML</a>. Jak to zazwyczaj bywa słabo z jej obsługą radzi sobie Internet Explorer. We wszystkich wydanych wersjach pojawia się problem z parsowaniem elementów języka HTML 5, a co za tym idzie nie ma domyślnie możliwości ich poprawnego ostylowania. Podobny problem w przeszłości występował w Firefoksie 2.</p>
<p><span id="more-1825"></span></p>
<h2>Zarys problemu</h2>
<p>Załóżmy więc, że tworzymy nowy projekt i jesteśmy na etapie dodawania nagłówka oraz stopki dokumentu.</p>
<pre class="brush: xml; title: ;">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;&gt;
    &lt;title&gt;Obsługa HTML 5 z CSS&lt;/title&gt;
    &lt;style&gt;
    body { text-align: center; margin: 0; padding: 0; font-family: Tahoma, Verdana, Arial; font-size: 11px; }
    header { font-style: italic; width: 770px; height: 70px; padding: 15px; margin: 5px auto; background-color: #FC0; text-align: left; }
    footer { font-weight: bold; clear: both; width: 770px; height: 15px; padding: 15px; margin: 5px auto; background-color: #FC0; text-align: left; }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;header&gt;Nagłówek&lt;/header&gt;
    &lt;footer&gt;Stopka&lt;/footer&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Nadaliśmy powyżej kilka atrybutów stylów pozycjonujących elementy oraz nadających im odpowiedni wygląd. Po przetestowaniu w Internet Explorerze i alternatywnych przeglądarkach zobaczymy jednak różne wyniki.</p>
<p style="text-align: center; font-size: 10px;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MjJfMDhfMTBfcXVpY2tfaGludF9pZThfYW5kX2h0bWw1O3F1aWNrX2hpbnRfaWU4X2FuZF9odG1sNV8wMl9meDQucG5n" alt="Wynik w Firefoksie 4" style="height: 298px;" /><br />Wynik w Firefoksie 4.</p>
<p style="text-align: center; font-size: 10px;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MjJfMDhfMTBfcXVpY2tfaGludF9pZThfYW5kX2h0bWw1O3F1aWNrX2hpbnRfaWU4X2FuZF9odG1sNV8wMV9pZTgucG5n" alt="Wynik w Internet Explorerze 8" style="height: 298px;" /><br />Wynik w Internet Explorerze 8.</p>
<h2>Internet Explorer &#8211; rozwiązanie pierwsze</h2>
<p>Aby pozbyć się tego problemu należy do sekcji <code>head</code> wstawić:</p>
<pre class="brush: xml; title: ;">&lt;script&gt;
document.createElement('header');
document.createElement('footer');
&lt;/script&gt;</pre>
<h2>Internet Explorer &#8211; rozwiązanie drugie</h2>
<p>Dla każdej wersji Internet Explorera można także dodać do dokumentu HTML (w sekcję <code>head</code>) zewnętrzny kod JavaScript, dzięki któremu osiągniemy wyżej opisany skutek.</p>
<pre class="brush: xml; title: ;">&lt;!--[if IE lt 9]&gt;
  &lt;script src=&quot;http://html5shiv.googlecode.com/svn/trunk/html5.js&quot;&gt;&lt;/script&gt;
&lt;![endif]--&gt;</pre>
<h2>Firefox 2</h2>
<p>Niespełna jeden procent internautów nadal używa drugiej odsłony popularnego lisa. Zarówno on, jak i wszystkie przeglądarki oparte na silniku Gecko pre 1.9b5 (np. <a target="_blank" href="http://caminobrowser.org/" >Camino</a> 1.x) posiadają <a target="_blank" href="http://blog.whatwg.org/supporting-new-elements-in-firefox-2" >błąd parsowania</a> dzięki któremu w przypadku otwarcia nowego znacznika każdy nieznany, wcześniej otwarty zostanie automatycznie zamknięty.</p>
<p>Rozważmy więc przykładowy kod.</p>
<pre class="brush: xml; title: ;">&lt;body&gt;
    &lt;header&gt;&lt;h1&gt;Nagłówek&lt;/h1&gt;&lt;/header&gt;
    &lt;footer&gt;
        &lt;p&gt;&lt;strong&gt;S&lt;/strong&gt;topka&lt;/p&gt;
    &lt;/footer&gt;
&lt;/body&gt;</pre>
<p>Przeglądarki oparte na omawianej wersji silnika Gecko przeparsują go w następujący sposób:</p>
<pre class="brush: xml; title: ;">&lt;body&gt;
    &lt;header&gt;&lt;/header&gt;&lt;h1&gt;Nagłówek&lt;/h1&gt;
    &lt;footer&gt;&lt;/footer&gt;&lt;p&gt;&lt;strong&gt;S&lt;/strong&gt;topka&lt;/p&gt;
&lt;/body&gt;</pre>
<p>Aby rozpocząć modyfikacje należy wykonać <a target="_blank" href="http://remysharp.com/2009/04/14/html5-and-firefox2/" >dwie rzeczy</a>:</p>
<ol>
<li>Wykonać przekierowanie przykładowo za pomocą <code>mod_rewrite</code> lub PHP tak, aby Firefox 2 uważał analizowany dokument jako XHTML
<ul>
<li>
<pre class="brush: plain; title: ;">RewriteCond %{REQUEST_URI} \.html$
RewriteCond %{HTTP_USER_AGENT} rv:1\.(([1-8]|9pre|9a|9b[0-4])\.[0-9.]+).*Gecko
RewriteRule .* - [T=application/xhtml+xml]</pre>
</li>
<li>
<pre class="brush: php; title: ;">if (preg_match('/rv:1\.(([1-8]|9pre|9a|9b[0-4])\.[0-9.]+).*Gecko/', $_SERVER['HTTP_USER_AGENT'])) {
  header('Content-type: application/xhtml+xml');
}</pre>
</li>
</ul>
</li>
<li>Dodać atrybut <code>xmlns</code> do znacznika <code>html</code>
<pre class="brush: xml; title: ;">&lt;html lang=&quot;pl&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;</pre>
</li>
</ol>
<p>W tym wypadku należy jednak pamiętać o tym, że XML jest wrażliwy na encje HTML-owe. Przykładowo więc używanie <code>&#038;</code><code>sdot;</code> należy zaniechać na rzecz <code>&#038;</code><code>#8901;</code>.</p>
<h2>Następnym razem dowiecie się&#8230;</h2>
<p>jak stworzyć wielokolumnową treść w CSS3?</p>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2010/08/24/szybka-porada-jak-zmusic-internet-explorer-8-i-firefox-2-do-obslugi-html-5-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Natchnienia warte uwagi &#8211; przegląd startupów #1 &#8211; maj 2010</title>
		<link>http://m1chu.eu/2010/05/31/natchnienia-warte-uwagi-przeglad-startupow-1-maj-2010/</link>
		<comments>http://m1chu.eu/2010/05/31/natchnienia-warte-uwagi-przeglad-startupow-1-maj-2010/#comments</comments>
		<pubDate>Mon, 31 May 2010 21:36:35 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[Natchnienia]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[firm]]></category>
		<category><![CDATA[kupno]]></category>
		<category><![CDATA[nauka]]></category>
		<category><![CDATA[platforma]]></category>
		<category><![CDATA[projekt]]></category>
		<category><![CDATA[przeglądarka]]></category>
		<category><![CDATA[reklama]]></category>
		<category><![CDATA[sprzedaż]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[szkoła]]></category>
		<category><![CDATA[telewizja]]></category>
		<category><![CDATA[wyszukiwarka]]></category>
		<category><![CDATA[zabawa]]></category>
		<category><![CDATA[zakupy]]></category>
		<category><![CDATA[zarządzanie]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1800</guid>
		<description><![CDATA[Kolejna część natchnień wartych uwagi, a pierwsza dotycząca przeglądu tegorocznych startupów. Poniżej przedstawiam 21 ciekawych i godnych uwagi pozycji&#8230; Śledzi osoby surfujące po stronie internetowej. Społecznościowy menedżer zadań. Telewizyjna przeglądarka internetowa. Video-chat z losowymi użytkownikami. Aplikacja do zarządzania projektami. Organizator skrzynek e-mail. Serwis oferujący skrypt Twitteropodobny. Pozwala na stworzenie aplikacji mobilnej. Umożliwia znalezienie najlepszych miejsc [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfcG9zdF9oZWFkZXIucG5n" alt="Gotowe wyrażenia regularne" style="height: 119px;" /></p>
<p>Kolejna część natchnień wartych uwagi, a pierwsza dotycząca przeglądu tegorocznych startupów. Poniżej przedstawiam <strong>21</strong> ciekawych i godnych uwagi pozycji&#8230;</p>
<p><span id="more-1800"></span></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://ghostrec.com/"  title="Ghostrec.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDFfZ2hvc3RyZWMucG5n" alt="Ghostrec.com" style="height: 237px;" /></a><br />Śledzi osoby surfujące po stronie internetowej.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://en.reddynote.com/"  title="Reddynote.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDJfcmVkZHlub3RlLnBuZw==" alt="Reddynote.com" style="height: 237px;" /></a><br />Społecznościowy menedżer zadań.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://kylo.tv/"  title="Kylo.tv"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDNfa3lsby5wbmc=" alt="Kylo.tv" style="height: 237px;" /></a><br />Telewizyjna przeglądarka internetowa.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://camchatscript.com/"  title="Camchatscript.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDRfY2FtY2hhdC5wbmc=" alt="Camchatscript.com" style="height: 215px;" /></a><br />Video-chat z losowymi użytkownikami.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://doolphy.com/"  title="Doolphy.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDVfZG9vbHBoeS5wbmc=" alt="Doolphy.com" style="height: 215px;" /></a><br />Aplikacja do zarządzania projektami.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://awayfind.com/"  title="Awayfind.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDZfYXdheWZpbmQucG5n" alt="Awayfind.com" style="height: 215px;" /></a><br />Organizator skrzynek e-mail.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://twitter-script.com/"  title="Twitter-script.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDdfdHdpdHRlcnNjcmlwdC5wbmc=" alt="Twitter-script.com" style="height: 215px;" /></a><br />Serwis oferujący skrypt Twitteropodobny.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://zerista.com/"  title="Zerista.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDhfemVyaXN0YS5wbmc=" alt="Zerista.com" style="height: 215px;" /></a><br />Pozwala na stworzenie aplikacji mobilnej.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://worksnug.com/"  title="Worksnug.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDlfd29ya3NudWcucG5n" alt="Worksnug.com" style="height: 215px;" /></a><br />Umożliwia znalezienie najlepszych miejsc do pracy w delegacji.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://calendarfly.com/"  title="Calendarfly.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTBfY2FsZW5kYXJmbHkucG5n" alt="Calendarfly.com" style="height: 215px;" /></a><br />Internetowy kalendarz z możliwością współdzielenia jego pól.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://supercoolschool.com/"  title="Supercoolschool.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTFfc3VwY3MucG5n" alt="Supercoolschool.com" style="height: 215px;" /></a><br />Kreator wirtualnej szkoły.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://football.picklive.com/"  title="Footbal.picklive.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTJfcGlja2xpdmUucG5n" alt="Footbal.picklive.com" style="height: 215px;" /></a><br />Piłka nożna na żywo.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://strings.com/"  title="Strings.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTNfc3RyaW5ncy5wbmc=" alt="Strings.com" style="height: 215px;" /></a><br />Usługa badająca aktywność użytkownika i na jej podstawie dobierająca odpowiednią dla niego treść.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://bizilla.com/"  title="Bizilla.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTRfYml6aWxsYS5wbmc=" alt="Bizilla.com" style="height: 215px;" /></a><br />Sprzedaż i kupno biznesu.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://blarket.com/"  title="Blarket.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTVfYmxhcmtldC5wbmc=" alt="Blarket.com" style="height: 215px;" /></a><br />Usługa, podobnie jak powyższa, pozwala na kupno i sprzedaż serwisów internetowych.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://tivix.pl/"  title="Tivix.pl"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTZfdGl2aXgucG5n" alt="Tivix.pl" style="height: 215px;" /></a><br />Platforma dyskusji na temat ulubionych programów telewizyjnych.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://soluto.com/"  title="Soluto.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTdfc29sdXRvLnBuZw==" alt="Soluto.com" style="height: 215px;" /></a><br />Aplikacja monitorująca stan komputera.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://movieclips.com/"  title="Movieclips.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMThfbW92aWVjbGlwcy5wbmc=" alt="Movieclips.com" style="height: 215px;" /></a><br />Serwis oferujący ulubione fragmenty filmowe.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://fablo.pl/"  title="Fablo.pl"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTlfZmFibG8ucG5n" alt="Fablo.pl" style="height: 215px;" /></a><br />Silnik wyszukiwarki dla sklepów internetowych.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://citisniper.pl/"  title="Citysniper.pl"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMjBfY2l0eXNuaXBlci5wbmc=" alt="Citisniper.pl" style="height: 215px;" /></a><br />Platforma grupowych zakupów.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.admongo.gov/"  title="Admongo.gov"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMjFfYWRtb25nby5wbmc=" alt="Admongo.gov" style="height: 215px;" /></a><br />Nauka o reklamach w formie zabawy.</p>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2010/05/31/natchnienia-warte-uwagi-przeglad-startupow-1-maj-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML 5: obsługa elementów AUDIO i VIDEO</title>
		<link>http://m1chu.eu/2010/03/19/html5-obsluga-elementow-audio-i-video/</link>
		<comments>http://m1chu.eu/2010/03/19/html5-obsluga-elementow-audio-i-video/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 21:14:33 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[(x)HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[elementy]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html 5]]></category>
		<category><![CDATA[natywnie]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[tagi]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1752</guid>
		<description><![CDATA[Serwisów oferujących przeglądanie zasobów multimedialnych nie brakuje w sieci. Do niedawna jednak wszystkie oparte były o wykorzystanie możliwości znaczników object lub niepoprawnego embed. Problem w tym, że rozwiązania te opierały się o wtyczki firm trzecich, takie jak QuickTime, czy Flash. HTML 5 standaryzuje osadzanie plików muzycznych i filmów. Kwestia dźwiękowa: element AUDIO Jedna z najbardziej, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MTlfMDNfMTBfaHRtbDVfYXVkaW9fdmlkZW87aHRtbDVfYXVkaW9fdmlkZW9fcG9zdF9oZWFkZXIucG5n" alt="HTML5: obsługa elementów AUDIO i VIDEO" style="height: 119px;" /></p>
<p>Serwisów oferujących przeglądanie zasobów multimedialnych nie brakuje w sieci. Do niedawna jednak wszystkie oparte były o wykorzystanie możliwości znaczników <code><a href="http://m1chu.eu/2008/12/14/jak-poprawnie-osadzic-flasha-w-kodzie-xhtml-strony/"  title="Jak poprawnie osadzić Flasha w kodzie (x)HTML strony?">object</a></code> lub niepoprawnego <code>embed</code>. Problem w tym, że rozwiązania te opierały się o wtyczki firm trzecich, takie jak QuickTime, czy Flash. HTML 5 standaryzuje osadzanie plików muzycznych i filmów.</p>
<p><span id="more-1752"></span></p>
<h2>Kwestia dźwiękowa: element AUDIO</h2>
<p>Jedna z najbardziej, od dawna oczekiwanych możliwości w HTML 5. Pozwala na natywne odtwarzanie utworów muzycznych w przeglądarce. Określana znacznikiem <code><a target="_blank" href="http://utnij.eu/html5_audio/"  title="Specyfikacja: audio">audio</a></code>.</p>
<p>Wg. specyfikacji może przyjmować pięć atrybutów:</p>
<ul>
<li><code><a target="_blank" href="http://utnij.eu/html5_video_autoplay/"  title="Specyfikacja: autoplay">autoplay</a></code> &#8211; określa czy odtwarzać automatycznie dźwięk, gdy zostanie on załadowany,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_video_controls/"  title="Specyfikacja: controls">controls</a></code> &#8211; określa czy wyświetlić odtwarzacz w standardowym układzie,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_video_loop/"  title="Specyfikacja: loop">loop</a></code> &#8211; określa czy powtarzać odtwarzanie,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_video_preload/"  title="Specyfikacja: preload">preload</a></code> &#8211; wyznacza, czy załadować zasobów w trakcie ładowania strony,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_src/"  title="Specyfikacja: src">src</a></code> &#8211; adres URL do pierwotnego, ładowanego źródła.</li>
</ul>
<p>Korzystając z powyższych informacji możemy otrzymać następujący przykład:</p>
<pre class="brush: xml; title: ;">&lt;!-- domyślny układ, startuje automatycznie, jedno źródło --&gt;
&lt;audio src=&quot;test.ogg&quot; controls autoplay&gt;&lt;/audio&gt;</pre>
<p>W praktyce pojawi się jednak problem, związany z implementacją różnych wersji kodeków w przeglądarkach (np. Vorbis, Advanced Audio Coding, MPEG-1 Audio Layer 3). Z tego powodu, trzeba aktualnie definiować dodatkowe zasoby w tagu <code><a target="_blank" href="http://utnij.eu/html5_source/"  title="Specyfikacja: source">source</a></code>. Obsługuje on atrybuty:</p>
<ul>
<li><code><a target="_blank" href="http://utnij.eu/html5_media/"  title="Specyfikacja: media">media</a></code> &#8211; zdefiniowanie typu zasobu. Domyślnie odpowiada wszystkim typom mediów,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_src/"  title="Specyfikacja: src">src</a></code> &#8211; adres URL do pierwotnego, ładowanego źródła,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_type/"  title="Specyfikacja: type">type</a></code> &#8211; definiuje typ zasobu, pozwalając na określenie przeglądarce, czy może odtworzyć go, bez konieczności pobierania. Musi być pod postacią prawidłowego <a target="_blank" href="http://utnij.eu/valid-mime-type/"  title="Specyfikacja: typy MIME">typu MIME</a>. Opcjonalnie, wewnątrz niego można zdefiniować parametr <code>codecs</code>, określający jak zakodowany jest zasób.</li>
</ul>
<pre class="brush: xml; title: ;">&lt;!-- domyślny układ, startuje automatycznie, wiele źródeł --&gt;
&lt;audio controls autoplay&gt;
	&lt;!-- Firefox ge 3.5, Chrome ge 3 beta, Opera ge 10.5 --&gt;
	&lt;source src=&quot;test.ogg&quot; type=&quot;audio/ogg; codecs=vorbis&quot;&gt;
	&lt;!-- Safari ge 4, Chrome ge 3 beta --&gt;
	&lt;source src=&quot;test.mp3&quot;&gt;
	&lt;!-- Opera ge 10.5, Firefox ge 3.5 --&gt;
	&lt;source src=&quot;test.wav&quot;&gt;
&lt;/audio&gt;</pre>
<p>Na wypadek niekompatybilnej przeglądarki można wewnątrz elementu <code>audio</code> wstawić alternatywną wiadomość, bądź <a href="http://m1chu.eu/2008/12/14/jak-poprawnie-osadzic-flasha-w-kodzie-xhtml-strony/"  title="Jak poprawnie osadzić Flasha w kodzie (x)HTML strony?">plik Flash</a> z autorskim odtwarzaczem.</p>
<pre class="brush: xml; title: ;">&lt;!-- domyślny układ, startuje automatycznie, wiele źródeł --&gt;
&lt;audio controls autoplay&gt;
	&lt;!-- Firefox ge 3.5, Chrome ge 3 beta, Opera ge 10.5 --&gt;
	&lt;source src=&quot;test.ogg&quot; type=&quot;audio/ogg; codecs=vorbis&quot;&gt;
	&lt;!-- Safari ge 4, Chrome ge 3 beta --&gt;
	&lt;source src=&quot;test.mp3&quot;&gt;
	&lt;!-- Opera ge 10.5, Firefox ge 3.5 --&gt;
	&lt;source src=&quot;test.wav&quot;&gt;
	&lt;!-- alternatywny wynik --&gt;
	Twoja przeglądarka nie obsługuje HTML 5.
&lt;/audio&gt;</pre>
<p>W rozwiązaniu powyższego problemu pomóc może także użycie możliwości JavaScriptu i metod/atrybutów/zdarzeń dostępnych w API. Pozwalają one na manipulację na obsługiwanych plikach. Niestety skorzystanie z możliwości obiektu <code>Audio</code> nie będzie możliwe w jakiejkolwiek wersji IE.</p>
<ul>
<li><code><a target="_blank" href="http://utnij.eu/html5_buffered/"  title="Specyfikacja: buffered">buffered</a></code> &#8211; określa ilość oraz początkowy i końcowy czas zbuforowanego zasobu,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_canplaytype/"  title="Specyfikacja: canPlayType()">canPlayType(typ_MIME)</a></code> &#8211; zwraca informacje na temat tego, czy dany typ obsługiwany jest przez klienta. Możliwe wyniki to: <em>no</em>, <em>maybe</em>, <em>probably</em>,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_currenttime/"  title="Specyfikacja: currentTime">currentTime</a></code> &#8211; pozwala na ustawienie lub pobranie aktualnego czasu odtwarzania,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_duration/"  title="Specyfikacja: duration">duration</a></code> &#8211; wyświetla czas trwania utworu. W wypadku nie załadowania go, zwraca <strong>NaN</strong> (Not a Number),</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_ended/"  title="Specyfikacja: ended">ended</a></code> &#8211; zwraca prawdę, jeżeli zakończono odtwarzanie (w przód),</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_loop/"  title="Specyfikacja: loop">loop</a></code> &#8211; wartość logiczna, pozwalająca na zapętlanie dźwięku,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_muted/"  title="Specyfikacja: muted">muted</a></code> &#8211; zwraca lub ustawia, czy kanały audio są wyciszone,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_pause/"  title="Specyfikacja: pause()">pause()</a></code> &#8211; pauzuje odtwarzanie,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_paused/"  title="Specyfikacja: paused">paused</a></code> &#8211; przetrzymuje informacje o tym, czy element jest spauzowany,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_play/"  title="Specyfikacja: play()">play()</a></code> &#8211; wznawia odtwarzanie,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_played/"  title="Specyfikacja: played">played</a></code> &#8211; przetrzymuje informacje o odtwarzanym elemencie,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_volume/"  title="Specyfikacja: volume">volume</a></code> &#8211; zwraca lub ustawia głośność dźwięku w zakresie od 0.0&#8230;0.1.</li>
</ul>
<p>Przykład:</p>
<pre class="brush: xml; title: ;">&lt;p&gt;
	&lt;button type=&quot;button&quot; onclick=&quot;stop();&quot;&gt;Stop&lt;/button&gt;
	&lt;button type=&quot;button&quot; onclick=&quot;lour();&quot;&gt;Wycisz&lt;/button&gt;
&lt;/p&gt;</pre>
<pre class="brush: jscript; title: ;">&lt;script type=&quot;text/javascript&quot;&gt;
var element = document.getElementById(&quot;audio&quot;); /* pobranie elementu */
function stop() { /* funkcja zatrzymująca */
	if ( !!(element.canPlayType) != false ) {
		element.currentTime = 0; /* ustawienie czasu na początek */
		element.pause(); /* pauza */
	}
}
function lour() { /* funkcja wyciszająca */
	if ( !!(element.canPlayType) != false ) {
		element.volume = 0; /* głośność na zero */
	}
}
&lt;/script&gt;</pre>
<p>Przykład z użyciem <code>new Audio()</code>:</p>
<pre class="brush: jscript; title: ;">var obj = new Audio('');
alert(!!(obj.canPlayType));</pre>
<h2>Kwestia filmowa: element VIDEO</h2>
<p>Drugi, ważny element HTML 5. Oparty o znacznik <code><a target="_blank" href="http://utnij.eu/html5_video/"  title="Specyfikacja: video">video</a></code>. Przyjmuje te same atrybuty co <code>audio</code>, a ponadto:</p>
<ul>
<li><code><a target="_blank" href="http://utnij.eu/html5_height/"  title="Specyfikacja: height">height</a></code> &#8211; określa wysokość okna playera,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_poster/"  title="Specyfikacja: poster">poster</a></code> &#8211; adres URL alternatywnej grafiki, wyświetlanej jeżeli domyślny zasób nie będzie dostępny,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_width/"  title="Specyfikacja: width">width</a></code> &#8211; określa szerokość okna odtwarzacza.</li>
</ul>
<p>Tak oto możemy stworzyć podstawowy przykład użycia:</p>
<pre class="brush: xml; title: ;">&lt;!-- buforowanie zasobu w trakcie ładowania strony, jeden plik --&gt;
&lt;video src=&quot;test.mp4&quot; preload&gt;&lt;/video&gt;</pre>
<p>Ponownie, w praktyce, powinno się zdefiniować kilka, różnych źródeł plików, w celu obsługi odtwarzacza przez większą ilość przeglądarek.</p>
<pre class="brush: xml; title: ;">&lt;!-- domyślny układ, buforuje przy ładowaniu, wiele źródeł --&gt;
&lt;video controls preload&gt;
	&lt;!-- Firefox ge 3.5, Chrome ge 3 beta, Opera ge 10.5 --&gt;
	&lt;source src=&quot;test.ogv&quot; type=&quot;audio/ogg; codecs='theora, vorbis'&quot;&gt;
	&lt;!-- Safari ge 4, Chrome ge 3 beta --&gt;
	&lt;source src=&quot;test.mp4&quot; type=&quot;video/mp4; codecs='avc1.42E01E, mp4a.40.2'&quot;&gt;
	&lt;!-- mobilne --&gt;
	&lt;source src=&quot;video.3gp&quot; type=&quot;video/3gpp; codecs='mp4v.20.8, samr'&quot;&gt;
	&lt;!-- alternatywny wynik --&gt;
	Twoja przeglądarka nie obsługuje HTML 5.
&lt;/video&gt;</pre>
<p style="text-align: center; font-size: 10px;"><video controls style="width: 480px; height: 320px;" poster="http://farm5.static.flickr.com/4019/4447584693_278f64dba5_o.png"><source src="http://osaddict.com/files/elephantsdream-480-h264-st-aac.mov" /><source src="http://mirrorblender.top-ix.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg" /><img src="http://farm5.static.flickr.com/4019/4447584693_278f64dba5_o.png" alt="Znacznik video nieobsługiwany" /></video><br />W odtwarzaczu wyświetlane są dwa filmy (Elephants Dream, Big Buck Bunny) na licencji zezwalającej na rozprowadzanie kopii w trybie online.</p>
<h2>Obróbka</h2>
<p>Zarówno w przypadku jednego, jak i drugiego elementu możemy je stylować.</p>
<pre class="brush: css; title: ;">audio, video {
	width: 480px;
	height: 320px;
}</pre>
<h2>Kompatybilność</h2>
<table class="article_table">
<thead>
<tr>
<th>Kodek (kontener)</th>
<th>Android</th>
<th>Chrome >= 3.0</th>
<th>Firefox >= 3.5</th>
<th>Iphone</th>
<th>Opera >= 10.5</th>
<th>Safari >= 4</th>
</tr>
</thead>
<tbody>
<tr>
<td class="t_sm">Theora video (Ogg/.ogv)</td>
<td>x</td>
<td>✓</td>
<td>✓</td>
<td>x</td>
<td>✓</td>
<td>x</td>
</tr>
<tr>
<td class="t_sm">Vorbis audio (Ogg/.ogg)</td>
<td>x</td>
<td>✓</td>
<td>✓</td>
<td>x</td>
<td>✓</td>
<td>x</td>
</tr>
<tr>
<td class="t_sm">H.264 video (MP4/.mp4)</td>
<td>✓</td>
<td>✓</td>
<td>x</td>
<td>✓</td>
<td>x</td>
<td>✓</td>
</tr>
<tr>
<td class="t_sm">AAC audio (MP4/.mp3)</td>
<td>✓</td>
<td>✓</td>
<td>x</td>
<td>✓</td>
<td>x</td>
<td>✓</td>
</tr>
<tr>
<td class="t_sm">WAV audio (WAV/.wav)</td>
<td>-</td>
<td>-</td>
<td>✓</td>
<td>-</td>
<td>✓</td>
<td>✓</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2010/03/19/html5-obsluga-elementow-audio-i-video/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://osaddict.com/files/elephantsdream-480-h264-st-aac.mov" length="103636531" type="video/quicktime" />
		</item>
		<item>
		<title>Wzorzec projektowania wtyczek jQuery na bazie metod i funkcji</title>
		<link>http://m1chu.eu/2010/03/06/wzorzec-projektowania-wtyczek-jquery-na-bazie-metod-i-funkcji/</link>
		<comments>http://m1chu.eu/2010/03/06/wzorzec-projektowania-wtyczek-jquery-na-bazie-metod-i-funkcji/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 18:17:32 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[biblioteka]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[funkcja]]></category>
		<category><![CDATA[iteracja]]></category>
		<category><![CDATA[metoda]]></category>
		<category><![CDATA[obiekt]]></category>
		<category><![CDATA[parametryzacja]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[prototyp]]></category>
		<category><![CDATA[wtyczka]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1689</guid>
		<description><![CDATA[Praca z jQuery prędzej, czy później wymusza na nas kompleksowe tworzenie rozwiązań wykonywanych po stronie użytkownika. Metody filtrujące, animacje, czy efekty na galeriach zdjęć łatwiej będzie osiągnąć i rozwijać posługując się, łączącymi się na wtyczki, mechanizmami metod i funkcji, dostępnymi w frameworku. Metoda, a funkcja? Podstawowa różnica pomiędzy nimi polega na tym, że operują na [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDZfMDVfMTBfanF1ZXJ5X3BsdWdpbnNfcGF0dGVybjtqcXVlcnlfcGx1Z2luc19wYXR0ZXJuX3Bvc3RfaGVhZGVyLnBuZw==" alt="Wzorzec projektowania wtyczek jQuery na bazie metod i funkcji" style="height: 119px;" /></p>
<p>Praca z jQuery prędzej, czy później wymusza na nas kompleksowe tworzenie rozwiązań wykonywanych po stronie użytkownika. Metody filtrujące, animacje, czy efekty na galeriach zdjęć łatwiej będzie osiągnąć i rozwijać posługując się, łączącymi się na wtyczki, mechanizmami metod i funkcji, dostępnymi w frameworku.</p>
<p><span id="more-1689"></span></p>
<h2>Metoda, a funkcja?</h2>
<p>Podstawowa różnica pomiędzy nimi polega na tym, że operują na innych obiektach. Każda nowa metoda musi być dołączona do prototypu <code>jQuery.fn</code>, a funkcja po prostu do obiektu <code>jQuery</code>.</p>
<pre class="brush: jscript; title: ;">/* metoda */
jQuery.fn.nazwa = function() {
	[...]
};</pre>
<pre class="brush: jscript; title: ;">/* funkcja */
jQuery.nazwa = function() {
	[...]
};</pre>
<p>W praktyce powoduje to, że do metody odwołujemy się operując na jakimś elemencie, identyfikatorze, bądź na klasie znajdującej się na stronie internetowej, a w przypadku funkcji, po prostu ją wywołujemy w celu wykonania jakieś akcji.</p>
<pre class="brush: jscript; title: ;">/* wywołanie: metoda */
$(element).nazwa();</pre>
<pre class="brush: jscript; title: ;">/* wywołanie: funkcja */
var x = $.nazwa();
alert(x);</pre>
<p>Obydwie możemy parametryzować. Argumentem może być zwykła zmienna, dowolnego, obsługiwanego przez JavaScript typu lub obiekt przechowujący zbiór pól o konkretnym przeznaczeniu.</p>
<pre class="brush: jscript; title: ;">/* metoda z parametrem */
jQuery.fn.nazwa = function(options) {
	[...]
};</pre>
<pre class="brush: jscript; title: ;">/* funkcja z parametrem */
jQuery.nazwa = function(options) {
	[...]
};</pre>
<h2>Umowne zasady tworzenia pluginów</h2>
<p>Twórcy <a target="_blank" href="http://jquery.com/" >jQuery</a>, poprzez dokumentację, podpowiadają jakimi zasadami należy się kierować, aby poprawnie tworzyć wtyczki. Mianowicie:</p>
<ol>
<li>Terminologie funkcja, metoda, czy klasa są stosowanie umownie, z racji specyfiki przeznaczenia każdego z tych elementów. Fraza <strong>metoda</strong> jest w powyższym wypadku synonimem całego pojęcia wtyczki.</li>
<li>Nazwy plików powinny być formowane następująco: <strong>jquery.[nazwa_wtyczki].js</strong>. Przykładowo: <strong>jquery.nazwa.js</strong>.</li>
<li>W metodach <code>this</code> jest referencją do aktualnie przetwarzanego obiektu jQuery.</li>
<li>Powinno się dołączać wtyczkę do obiektu nadrzędnego poprzez <code>jQuery</code>, a nie <code>$</code>, co użytkownikom zwiększa pole manewru we wprowadzaniu zmian z użyciem <code>jQuery.noConflict()</code>.</li>
<li>W celu uniknięcia problemów z poprawnością kodu po jego wcześniejszej kompresji, wszelkie metody oraz funkcje powinny kończyć się znakiem średnika (<code>;</code>).</li>
<li>Użycie <code><a target="_blank" href="http://utnij.eu/6f63d2/" >.each</a></code> pozwala na bezproblemową iteracje po wszystkich elementach na których operujemy w metodzie.</li>
<li>Metoda domyślnie musi zwracać wartość.</li>
</ol>
<div class="explain">
<p><code>.each(function(indeks, element))</code> &#8211; przenosi się po każdym elemencie drzewa DOM, będących częścią obiektu jQuery, za każdym razem wykonując funkcję określoną jako parametr opisywanej metody.</p>
<p><strong>Przykład:</strong></p>
<pre class="brush: xml; title: ;">&lt;ol&gt;
	&lt;li&gt;play&lt;/li&gt;
	&lt;li&gt;the&lt;/li&gt;
	&lt;li&gt;game&lt;/li&gt;
&lt;/ol&gt;</pre>
<pre class="brush: jscript; title: ;">$('ol').each(function(i, e) {
	// e == this
	// e jest warte użycia w konkretnych zagnieżdżeniach, kiedy to this nie zawsze wskazuje na aktualnie analizowany element pętli
	$(e).html('&lt;strong&gt;' + $(this).text() + '&lt;/strong&gt;');
});</pre>
</div>
<h2>Przekazywanie parametrów w celu kontrolowania zachowań wtyczki</h2>
<p>Czym byłby plugin bez możliwości prostej parametryzacji określonych zachowań? W celu ułatwienia zrozumienia ich tworzenia postaramy się stworzyć bardzo prosty tester poprawności wpisywanych do pola danych (np. o identyfikatorze <code>#nick</code>). Sprawdzimy w nich, czy wprowadzony tekst będzie odpowiadał odpowiedniemu wzorcowi wyrażenia regularnego i będzie wystarczająco długi. Ponadto określimy do jakiego elementu zwrócić informację na wypadek niespełnienia wcześniej wymienionych kryteriów. Warto więc będzie zdefiniować na stałe wartości tych opcji oraz dać przyszłym jej użytkownikom możliwość nadpisania ich w argumentach wywoływanej metody.</p>
<div class="explain"><code>jQuery.extend([ tryb_rekursywny ,] obiekt_rozszerzany, obiekt_1_rozszerzający [, ... obiekt_n_rozszerzający])</code> &#8211; łączenie dwóch lub kilku właściwości obiektów do osobnego.
<ul>
<li><strong>tryb_rekursywny</strong> &#8211; przyjmuje wartości logiczne (true/false) w celu wykonania rekursywnego łączenia,</li>
<li><strong>obiekt_rozszerzany</strong> &#8211; element nadpisywany (w celu uniknięcia należy pozostawić puste),</li>
<li><strong>obiekt_x_rozszerzający</strong> &#8211; elementy łączone.</li>
</ul>
</div>
<p>Załóżmy więc, że nazwiemy naszą wtyczkę <strong>filtrate</strong>, a domyślne dane będziemy przetrzymywać w obiekcie <strong>defaults</strong>.</p>
<pre class="brush: jscript; title: ;">jQuery.fn.filtrate = function() {
	var defaults = {
		length:		6, // minimalna długość wprowadzanego tekstu
		regexp:		/[0-9a-z]/gi, // kryterium wprowadzanych znaków
		returnto:	'footer' // informacja o błędzie zostanie zwrócona do tego elementu
	};

	alert(defaults.regexp); // przykładowe użycie
};</pre>
<p>Za pomocą parametru <strong>options</strong> przekażemy spersonalizowane dane konfiguracyjne.</p>
<pre class="brush: jscript; title: ;">jQuery.fn.filtrate = function(options) {
	var defaults = {
			length:		6, // minimalna długość wprowadzanego tekstu
			regexp:		/[0-9a-z]/gi, // kryterium wprowadzanych znaków
			returnto:	'footer' // informacja o błędzie zostanie zwrócona do tego elementu
	}; 

	// rozszerzenie domyślnej konfiguracji
	var options = $.extend(defaults, options);

	alert(options.regexp); // przykładowe użycie
};</pre>
<p>Propozycje wywołań metody z użyciem argumentów.</p>
<pre class="brush: jscript; title: ;">$('#nick').filtrate({length: 3});
// lub
$('#nick').filtrate({
	regexp: /[0-9]/gi,
	length: 3
});</pre>
<p>Do ustawień nie ma jednak publicznego dostępu. Możemy co prawda skonfigurować je przy wywoływaniu wtyczki, ale nie bezpośrednio, np. później. W tym celu należy przenieść domyślne wartości do własności składowej metody oraz połączyć wprowadzane i predefiniowane dane bez modyfikacji tych drugich.</p>
<pre class="brush: jscript; title: ;">jQuery.fn.filtrate = function(options) {
	// rozszerzenie domyślnej konfiguracji bez jej nadpisywania (pierwszy argument pusty)
	var options = $.extend({}, $.fn.filtrate.defaults, options);

	alert(options.regexp); // przykładowe użycie
};

$.fn.filtrate.defaults = {
	length:		6, // minimalna długość wprowadzanego tekstu
	regexp:		/[0-9a-z]/gi, // kryterium wprowadzanych znaków
	returnto:	'footer' // informacja o błędzie zostanie zwrócona do tego elementu
};</pre>
<p>Zewnętrzny programista ma teraz szansę wykonania ustawień przed i po wywołaniu wtyczki, a także bez konieczności robienia tego w bloku <code>jQuery(document).ready(function() [...]);</code>.</p>
<pre class="brush: jscript; title: ;">// nadpisanie długości spoza parametru
$.fn.filtrate.defaults.length = 3;
$('#nick').filtrate({regexp: /[0-9]/gi});</pre>
<h2>Prywatne funkcje &#8211; ukrywamy poszczególne elementy</h2>
<p>Nie każda partia kodu powinna być dostępna do bezpośredniego wywołania przez użytkownika wtyczki. Przykładem może być tutaj funkcja użytkowa, stworzona stricte do celów danej metody. Aby tego dokonać, należy opleść całą definicję pluginu w funkcję zamykającą (<em>closure</em>) oraz po za samą metodą użyć standardowej formy tworzenia funkcji w JavaScript. Metodologia tworzenia funkcji w jQuery nie zda tutaj prawidłowego rezultatu. Dostęp będzie nadal publiczny.</p>
<pre class="brush: jscript; title: ;">(function($) { // start: closure
	$.fn.filtrate = function() {
		$.logs(1); // ostrzeżenie z zawartością '1'

		logs(1); // ostrzeżenie z zawartością '1'
	};		

	function logs($obj) {
    	alert($obj);
  	};

	$.logs = function($obj) {
		alert($obj);
	};
})(jQuery); // end: closure

jQuery(document).ready(function() {
	$('#nick').filtrate();

	$.logs(1); // ostrzeżenie z zawartością '1'
	logs(1); // brak dostępu do tej funkcji z zewnątrz
});</pre>
<h2>Wywoływanie funkcji oraz innych metod we wtyczce</h2>
<p>Zaistnieć może także sytuacja przeciwna do powyższej. Z różnych powodów możemy chcieć skorzystać z publicznie dostępnej metody, zaimplementowanej wewnątrz wtyczki, którą tworzymy lub z funkcji przedstawionych na początku artykułu.</p>
<pre class="brush: xml; title: ;">[...]
        &lt;footer&gt;
        	&lt;p&gt;Wpisz swój script nick&lt;/p&gt;
            &lt;p&gt;Wpisz swój a href nick&lt;/p&gt;
        &lt;/footer&gt;
[...]</pre>
<p>Mamy przykładowy zestaw paragrafów, z których będziemy chcieli wykluczyć pewny ciąg znaków. Ponieważ będziemy sprawdzać więcej elementów niż jeden, skorzystamy z wcześniej wymienionej metody iteracyjnej <code>.each()</code>, a następnie pobierzemy ich zawartości, usuniemy stosowną frazę (korzystając z osobnej funkcji/metody) i zwrócimy wynik do znacznika je zawierającego.</p>
<pre class="brush: jscript; title: ;">jQuery.fn.filtrate = function(options) {
	var defaults = {
		erase:	 	/a href/g, // tekst do usunięcia
		usemethod:	true // pomocnicze, użycie metody lub funkcji
	};
	// rozszerzenie domyślnej konfiguracji
	var options = $.extend(defaults, options);

	return this.each(function() {
		var context = $(this).html(); // pobranie zawartości elementu
		switch (options.usemethod) // dodany w celach naukowych ;]
		{
			case false:
				context = $.cleanup(context, options.erase); // wywołanie funkcji
				break;
			default:
				context = $.fn.filtrate.cleanup(context, options.erase); // wywołanie metody
				break;
		}
		$(this).html(context); // zapisanie zmodyfikowanej zawartości elementu
	});
};		

// metoda zaimplementowana we wtyczce
jQuery.fn.filtrate.cleanup = function(context, erase) {
	return context.replace(erase, ''); // usunięcie frazy z ciągu
};

// osobna funkcja
jQuery.cleanup = function(context, erase) {
	return context.replace(erase, ''); // usunięcie frazy z ciągu
};

jQuery(document).ready(function() {
	// tryb wywoływania z metody
	$('footer p').filtrate({erase: /script/g});

	// tryb wywoływania spoza metody
	return $('footer p').each(function() {
		var context = $(this).html();
		context = $.fn.filtrate.cleanup(context, /a href/g);
		context = $.cleanup(context, /script/g);
		$(this).html(context);
	});
});</pre>
<h2>Osiągamy postawiony cel</h2>
<p>Na podstawie powyższych rad możemy osiągnąć postawiony sobie cel &#8211; tester poprawności wpisywanych danych do pola typu <code>input</code>. Rozwiązanie będzie zezwalać na testowanie wielu pól naraz.</p>
<pre class="brush: xml; title: ;">[...]
    	&lt;header&gt;
			&lt;p&gt;&lt;input type=&quot;text&quot; id=&quot;nick&quot;&gt;&lt;/p&gt;
			&lt;p&gt;&lt;input type=&quot;text&quot; id=&quot;nick_second&quot;&gt;&lt;/p&gt;
        &lt;/header&gt;
[...]</pre>
<p>Wywołanie odbywać się będzie w momencie zwolnienia przycisku klawiatury.</p>
<pre class="brush: jscript; title: ;">jQuery(document).ready(function() {
	$('input').keyup(function() {
		$('input').filtrate({regexp: /[a-z]/g});
	});
});</pre>
<p>W przestrzeni funkcji zawierającej wtyczkę znajdzie się prywatna funkcja logująca akcje oraz dwie publiczne metody implementowane w pluginie. Pierwsza z nich będzie sprawdzać poprawność wpisywanego tekstu pod względem zadanego wzorca, a druga długość wprowadzonego ciągu znaków.</p>
<pre class="brush: jscript; title: ;">	// metoda testująca poprawność wpisanych znaków
	$.fn.filtrate.preg_match = function(pattern, subject) {
		var subject_splited = subject.split(''); // utworzenie tablicy znaków
		for ( i=0; i &lt; subject_splited.length; ++i ) // iteracja po każdym ze znaków
		{
			// jeżeli którykolwiek znak nie będzie odpowiadał wzorcowi metoda zwraca fałsz
			if ( subject_splited[i].match(new RegExp(pattern)) == null )
			{
				return false;
			}
		}
		return true; // wszystkie znaki są odpowiednie, prawda - jedziemy dalej ;]
	};

	// metoda porównująca długości ciągów
	$.fn.filtrate.strlen_compare = function(string, min_length) {
		var length = string.length;
		if ( length &lt; 1 ) // tekst nie został wpisany
		{
			return false;
		}
		else if ( length &lt; min_length ) // tekst krótszej długości niż wymagana
		{
			return min_length - length;
		}
		return true; // tekst odpowiedniej długości
	};

	// funkcja prywatna, logująca akcje
	function log_alerts(returnto, text)
	{
		// jeżeli nie podano tekstu do wypisania, czyścimy zawartość znacznika przetrzymującego ostrzeżenia i informacje
		if ( text == undefined )
		{
			$(returnto).html('');
			return;
		}

		// dodanie nowego akapitu z zwróconą treścią do podanego znacznika
		$('&lt;p&gt;' + text + '&lt;/p&gt;').appendTo(returnto);
	}</pre>
<p>Domyślne opcje ustawimy poza wtyczką. W niej samej, dla każdego wskazanego elementu strony, sprawdzimy najpierw warunek długości, a gdy zostanie spełniony, także zawartości.</p>
<pre class="brush: jscript; title: ;">(function($) { // start: closure
	$.fn.filtrate = function(options) {
		// rozszerzenie domyslnej konfiguracji bez jej nadpisywania (pierwszy argument pusty)
		var options = $.extend({}, $.fn.filtrate.defaults, options);

		var context, strlen_compared_result;

		// czyszczenie znacznika zawierającego informacje o stanie pól
		log_alerts(options.returnto);

		// sprawdzenie każdego elementu
		return this.each(function(i) {
			context = $(this);

			// testowanie długości
			strlen_compared_result = $.fn.filtrate.strlen_compare(context.val(), options.length);
			switch (strlen_compared_result)
			{
				case false: // w wypadku niewpisania tekstu
					// logowanie akcji
					log_alerts(options.returnto, 'Pole &lt;strong&gt;' + context.attr('id') + '&lt;/strong&gt; jest puste');
					return true;
					break;
				case true: // w wypadku odpowiedniej długości tekstu
					// puste
					break;
				default: // w wypadku za krótkiego tekstu zwracany jest: tekst + wymagana długość + ilość brakujących znaków
					log_alerts(options.returnto, 'Pole &lt;strong&gt;' + context.attr('id') + '&lt;/strong&gt; zawiera za mało znaków (minimum: ' + options.length + ' / brakuje: ' + strlen_compared_result + ')');
					return true;
					break;
			}

			// testowanie typów znaków znajdujących się w tekście
			switch ($.fn.filtrate.preg_match(options.regexp, context.val()))
			{
				case false: // w wypadku pojawienia się niedozwolonych znaków
					log_alerts(options.returnto, 'Pole &lt;strong&gt;' + context.attr('id') + '&lt;/strong&gt; zawiera niedozwolone znaki');
					return true;
					break;
				default: // w wypadku poprawnego sformowania tekstu
					log_alerts(options.returnto, 'Pole &lt;strong&gt;' + context.attr('id') + '&lt;/strong&gt; jest prawidłowo wypełnione');
					break;
			}
		});
	};

	$.fn.filtrate.defaults = {
		length:	 6, // minimalna dlugosc wprowadzanego tekstu
		regexp:	 /[0-9a-z]/gi, // kryterium wprowadzanych znaków
		returnto:   'footer' // informacja o bledzie zostanie zwrócona do tego elementu
	};

	// pozostałe dwie metody + prywatna funkcja
})(jQuery); // end: closure</pre>
<p>Przykład ten powinien przybliżyć kwestię wcześniej poruszone w artykule. Na jego podstawie udostępniłem także <a href="http://use.m1chu.eu/-jquery/plugin-and-function-development-pattern/index.html" >testową stronę</a> oraz <a href="http://get.m1chu.eu/-examples/-jquery/plugin-and-function-development-pattern/get_pafdp.php" >gotowe pliki do pobrania</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2010/03/06/wzorzec-projektowania-wtyczek-jquery-na-bazie-metod-i-funkcji/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Natchnienia warte uwagi &#8211; strony w technologii Flash #1 &#8211; listopad 2009</title>
		<link>http://m1chu.eu/2009/11/03/natchnienia-warte-uwagi-strony-w-technologii-flash-1-listopad-2009/</link>
		<comments>http://m1chu.eu/2009/11/03/natchnienia-warte-uwagi-strony-w-technologii-flash-1-listopad-2009/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 21:57:17 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[Natchnienia]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[2advanced]]></category>
		<category><![CDATA[coca cola]]></category>
		<category><![CDATA[digaworks]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[ge]]></category>
		<category><![CDATA[imagineair]]></category>
		<category><![CDATA[strony www]]></category>
		<category><![CDATA[technologia]]></category>
		<category><![CDATA[zune]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1574</guid>
		<description><![CDATA[Dobrze skonstruowany serwis internetowy bazujących na technologii Flash to nie tylko dużo pracy, ale często także oszałamiający efekt. Zbiór motywujących i wartych uwagi przedstawiam dziś w dalszej części tego wpisu. Sarasota &#8211; v5 Design &#8211; pokaz krajobrazu z nastrojowym podkładem dźwiękowym. Interaktywna podróż po epokach. Modernistyczna strona web developerów. Przykład dobrze wyglądającego portfolio graphic designera. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfcG9zdF9oZWFkZXIucG5n" alt="Gotowe wyrażenia regularne" style="height: 119px;" /></p>
<p>Dobrze skonstruowany serwis internetowy bazujących na technologii Flash to nie tylko dużo pracy, ale często także oszałamiający efekt. Zbiór motywujących i wartych uwagi przedstawiam dziś w dalszej części tego wpisu.</p>
<p><span id="more-1574"></span></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.v5design.com/"  title="Sarasota - v5 Design"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMDFfc2FyYXNvdGEucG5n" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Sarasota &#8211; v5 Design &#8211; pokaz krajobrazu z nastrojowym podkładem dźwiękowym.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.sensisoft.com/"  title="Sensi Soft"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMDJfc2Vuc2lzb2Z0LnBuZw==" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Interaktywna podróż po epokach.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.digaworks.com/"  title="DigaWorks"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMDNfZGlnYXdvcmtzLnBuZw==" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Modernistyczna strona web developerów.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.arihirvonen.com/"  title="Ari's Labs"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMDRfYXJpc2xhYi5wbmc=" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Przykład dobrze wyglądającego portfolio graphic designera.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.econtent.hu/flash_version/index.html"  title="e-content solutions"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMDVfZWNzLnBuZw==" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.elipseagency.com/agency.html"  title="Elipse Agency"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMDZfdjc3LnBuZw==" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.aparte-graphique.com/infographiste_freelance_webdesigner_3D.htm"  title="APARTE Graphique"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMDdfYXBhcnRlLnBuZw==" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Przykład rozwiązania bazującego na technologii Flash z motywem w postaci użytego tła.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://ladio.ru/flash/en/index.html"  title="Ladio"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMDhfbGFkaW8ucG5n" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Interaktywność i akcja zależna od ruchu myszki.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.theologos.gr/en.html"  title="Theologos House of Jewellery"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMDlfdGhlb2xvZ29zLnBuZw==" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Konfiguracja wtyczki FeedSmith w panelu.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.gettheglass.com/index2.html"  title="Get the Glass!"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMTBfZ2V0dGhlbG9nb3MucG5n" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://realcasual.com.ua/"  title="Real Casual"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMTFfcmVhbGNhc3VhbHMucG5n" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.patagonia.com/web/eu/tinshed/index.jsp?slc=en_GB&#038;sct=PT&#038;&#038;ln=241"  title="Patagonia"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMTJfcGF0YWdvbmlhLnBuZw==" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://ge.ecomagination.com/smartgrid/#/landing_page"  title="GE"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMTNfZWNvLnBuZw==" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.zunejourney.net/"  title="Zune"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMTRfenVuZWpvdXJuZXkucG5n" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.syfy.com/tinman/oz/"  title="Infinite OZ"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMTVfc3lmeS5wbmc=" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Efekt oparty o przenoszenie użytkownika pomiędzy scenami.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://demo.northkingdom.com/ihuvudetpatoyota/index_en.html"  title="On Toyota's mind"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMTZfdG95b3RhLnBuZw==" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://demo.northkingdom.com/gotmilk/planetinneed/"  title="Brittlelactica"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMTdfaW4ucG5n" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Wkomponowanie w strukturę elementy filmowych.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://jan-kask.dreamhosters.com/school/imagine_air/flash.html"  title="ImagineAir"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMThfaW1hZ2luZWFpci5wbmc=" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.2advanced.com/"  title="2advanced Studios"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMTlfMmFkdmFuY2VkLnBuZw==" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Klasyka tematu.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://carboncalculator.direct.gov.uk/index.html"  title="Carbon Calculator"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMjBfY28yLnBuZw==" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.nespresso.com/citiz/"  title="Nespresso - Citiz"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMjFfY2l0aXoucG5n" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.saizenmedia.com/nightwish/"  title="Saizen Media Studios"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMjJfbmlnaHR3aXNoLnBuZw==" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.yodabaz.com/"  title="yodabaz"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMjNfeW9kYWJpei5wbmc=" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.gringo.nu/projects/cokelight-worldflavours/#/world"  title="Coca-Cola"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMjRfY2MucG5n" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.piotrowskimichal.com/"  title="PiotrowskiMichal.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMjVfcG0ucG5n" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Portfolio z rodzimego rynku.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.wyburzenia.pl/"  title="Specjalistyczna Firma Wyburzeniowa"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMjZfd3lidXJ6ZW5pYS5wbmc=" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Strona polskiej firmy specjalizującej się w wyburzeniach.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.atsushiwatanabe.com/"  title="Atsushi Watanabe"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMjdfYXcucG5n" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://graphicdesign.bg/"  title="Graphic Design"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMjhfZ3JhcGhpY2Rlc2lnbi5wbmc=" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.catsper1.com/"  title="Catsper One"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfMjlfY2F0c3BoZXIucG5n" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p>Podziękowania dla <a target="_blank" href="http://dzi3ciol.com"  title="dzi3ciol.com">dzi3ciola</a> za wykonanie grafiki wstępnej.</p>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2009/11/03/natchnienia-warte-uwagi-strony-w-technologii-flash-1-listopad-2009/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>15 przydatnych wyrażeń regularnych w PHP</title>
		<link>http://m1chu.eu/2009/10/13/15-przydatnych-wyrazen-regularnych-w-php/</link>
		<comments>http://m1chu.eu/2009/10/13/15-przydatnych-wyrazen-regularnych-w-php/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 20:23:51 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[Świat IT]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[regexp.pl]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[wyrażenia regularne]]></category>
		<category><![CDATA[wzorzec]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1536</guid>
		<description><![CDATA[W pewnym stadium zaawansowania wyrażenia regularne stają się potężnym narzędziem każdego programisty PHP (i nie tylko). A to dlatego, że pozwalają na wykonywanie operacji, których często nie sposób dokonać w prosty sposób przy pomocy standardowych funkcji zawartych w tym języku. Walidacja zawartości zmiennych, czy podmienianie specyficznej części ich zawartości &#8211; na to pozwalają wyrażenia regularne. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MTNfMDlfMDlfMTVfcmVnZXhwczsxNV9yZWdleHBzX3Bvc3RfaGVhZGVyLnBuZw==" alt="Gotowe wyrażenia regularne" style="height: 119px;" /></p>
<p>W pewnym stadium zaawansowania wyrażenia regularne stają się potężnym narzędziem każdego programisty PHP (i nie tylko). A to dlatego, że pozwalają na wykonywanie operacji, których często nie sposób dokonać w prosty sposób przy pomocy standardowych funkcji zawartych w tym języku. Walidacja zawartości zmiennych, czy podmienianie specyficznej części ich zawartości &#8211; na to pozwalają wyrażenia regularne. 15-ście przykładowych, najbardziej niezbędnych dla każdego web developera, skompletowałem w dalszej części artykułu. Do Waszej dyspozycji oddaję także prosty <a target="_blank" href="http://regexp.pl/"  title="regexp.pl - tester wyrażeń regularnych"><strong>serwis</strong></a> sprawdzający poprawność wprowadzanych wzorców.</p>
<p><span id="more-1536"></span></p>
<h2>1. Walidacja adresu e-mail opartego na hoście</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/^([a-z0-9]{1})([^\s\t\.@]*)((\.[^\s\t\.@]+)*)@([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)\.([a-z0-9]{2,6})([.]?)$/Diu</pre>
<h3>Opis:</h3>
<p>Wyrażenie ma za zadanie sprawdzać, czy wprowadzony przez użytkownika adres e-mail ma poprawną formę. Aby test zakończył się sukcesem muszą zostać spełnione następujące warunki:</p>
<ul>
<li>nazwa użytkownika musi zaczynać się od znaku litery lub cyfry, nie może zawierać spacji, tabulatorów, aty, za to mogą się znajdować w nim kropki, pod warunkiem, że nie występują jedna, po drugiej,</li>
<li>po nazwie użytkownika musi pojawiać się znak małpy,</li>
<li>domena, podobnie jak nazwa użytkownika, musi rozpoczynać się od litery, bądź cyfry, po czym do znaków dozwolonych dochodzą <strong>-</strong> oraz <strong>.</strong>, pod warunkiem, że pierwszy z wcześniej wymienionych znaków nie znajduje się na początku lub na końcu nazwy subdomeny (wyjątkiem są dwa myślniki na jej końcu odpowiadające często prefiksom <strong>xn--</strong>), a drugi nie jest poprzedzany swoim odpowiednikiem. <a target="_blank" href="http://pl.wikipedia.org/wiki/Domena_najwy%C5%BCszego_poziomu"  title="TLD - informacje">TLD</a> może mieć długość od dwóch do sześciu znaków,</li>
<li>domena może być zakończona kropką,</li>
<li>rozwiązanie nie sprawdza jak długi jest wprowadzony adres e-mail.</li>
</ul>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-email/index.php"  title="Przykład walidacji adresu e-mail">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>2.a_a-d@n-do.x-d.pl</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>2.a_a-d@n-do.x-d.v-.pl (część domeny kończąca się nieprawidłowym znakiem)</p>
<h3>Uwagi:</h3>
<p>Jeżeli rozwiązanie w jakimkolwiek stopniu zawiedzie można pokusić się o użycie wyrażenia z ostatniej aktualizacji <a target="_blank" href="http://utnij.eu/f24/"  title="Zmiany w pliku logical_filters.c">pliku logical_filters.c ze źródeł PHP</a>.</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$email = trim('adres@domena.pl');
if ( !preg_match('/^([a-z0-9]{1})([^\s\t\.@]*)((\.[^\s\t\.@]+)*)@([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)\.([a-z0-9]{2,6})([.]?)$/Diu', $email) )
{
	print 'Nieprawidłowy adres e-mail';
}</pre>
<h3>Rozwiązanie oparte o <a target="_blank" href="http://pl2.php.net/filter_var"  title="Specyfikacja filter_var()">filter_var</a> (PHP >= 5.2):</h3>
<pre class="brush: php; title: ;">$email = trim('adres@domena.pl');
if ( (bool)filter_var($email, FILTER_VALIDATE_EMAIL) === false )
{
	print 'Nieprawidłowy adres e-mail';
}</pre>
<h2>2. Walidacja adresu e-mail opartego na hoście lub IPv4 serwera</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/^([a-z0-9]{1})([^\s\t\.@]*)((\.[^\s\t\.@]+)*)@((([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)\.([a-z0-9]{2,6})([.]?))|((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))$/Diu</pre>
<h3>Opis:</h3>
<p>Wyrażenie ma za zadanie sprawdzać, czy wprowadzony przez użytkownika adres e-mail ma poprawną formę. Aby test zakończył się sukcesem muszą zostać spełnione warunki z poprzedniego punktu oraz:</p>
<ul>
<li>po znaku @ musi się pojawić opisany już wcześniej prawidłowo sformowany host lub adres IPv4 serwera w postaci czterech, dziesiętnych oktetów.</li>
</ul>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-email/index.php"  title="Przykład walidacji adresu e-mail">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>2.a_a-d@64.64.100.100</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>2.a_a-d@64.64.256.100 (trzeci oktet jest po za zakresem)</p>
<h3>Uwagi:</h3>
<p>Jeżeli rozwiązanie w jakimkolwiek stopniu zawiedzie można pokusić się o użycie wyrażenia z ostatniej aktualizacji <a target="_blank" href="http://utnij.eu/f24/"  title="Zmiany w pliku logical_filters.c">pliku logical_filters.c ze źródeł PHP</a>.</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$email = trim('adres@85.64.100.100');
if ( !preg_match('/^([a-z0-9]{1})([^\s\t\.@]*)((\.[^\s\t\.@]+)*)@((([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)\.([a-z0-9]{2,6})([.]?))|((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))$/Diu', $email) )
{
	print 'Nieprawidłowy adres e-mail';
}</pre>
<h3>Rozwiązanie oparte o <a target="_blank" href="http://pl2.php.net/filter_var"  title="Specyfikacja filter_var()">filter_var</a> (PHP >= 5.2):</h3>
<pre class="brush: php; title: ;">$email = trim('adres@domena.pl');
if ( (bool)filter_var($email, FILTER_VALIDATE_EMAIL) === false )
{
	print 'Nieprawidłowy adres e-mail';
}</pre>
<h2>3. Prosta weryfikacja adresu URL</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/^(http|ftp)([s]{0,1}):\/\/([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)(\.([a-z0-9]{2,6})){0,1}((:[0-9]){0}|(:[1-9]{1}[0-9]*))\//iu</pre>
<h3>Opis:</h3>
<p>Zweryfikować, czy użytkownik wprowadził adres URL, wg wzoru:</p>
<pre class="brush: plain; title: ;">protokół://adres_serwera:port/</pre>
<ul>
<li>dozwolone protokoły: <strong>http</strong>, <strong>https</strong>, <strong>ftp</strong>, <strong>ftps</strong>,</li>
<li>adres serwera w formie serwera lokalnego, subdomen, domeny i rozszerzenia,</li>
<li>port jest opcjonalny,</li>
<li>dalsze wprowadzone dane (jak Query String) nie są sprawdzane,</li>
<li>konstrukcja jest przeznaczona do sprawdzanie adresów opartych na IPv4.</li>
</ul>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-url/index.php"  title="Przykład walidacji adresu URL">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>http://m1chu.eu/</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>htt://adres.com/temp/ (nieprawidłowy schemat)</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$url = trim('http://m1chu.eu');
if ( !preg_match('/^(http|ftp)([s]{0,1}):\/\/([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)(\.([a-z0-9]{2,6})){0,1}((:[0-9]){0}|(:[1-9]{1}[0-9]*))\//iu', $url) )
{
	print 'Nieprawidłowy adres URL';
}</pre>
<h2>4. Wycinanie hosta z portem z adresu URL</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/^(http|ftp)([s]{0,1}):\/\/((.*)\.[a-z0-9]{2,6}|((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]))){0,1}((:[0-9]){0}|(:[1-9]{1}[0-9]*))\//iu</pre>
<h3>Opis:</h3>
<p>Pobrać host wraz z portem (jeżeli został podany) z URI. Pozostałe zasady są tożsame z wymienionymi w poprzednim punkcie.</p>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-extract-domain/index.php"  title="Przykład wycinania hosta z portem">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>http://m1chu.eu:80/ (zwróci: m1chu.eu:80)</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>htt://adres.com/temp/ (nieprawidłowy schemat)</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$url = trim('ftps://stro.eu:1000/file.exe');
if ( preg_match('/^(http|ftp)([s]{0,1}):\/\/((.*)\.[a-z0-9]{2,6}|((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]))){0,1}((:[0-9]){0}|(:[1-9]{1}[0-9]*))\//iu', $url, $matches) )
{
	// $matches[3] - nazwa serwera z domeną lub adres IPv4
	// $matches[10] - port
	print $matches[3] . ':' . $matches[10];
}</pre>
<h2>5. Sprawdzanie adresu IP (protokół IPv4)</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/Du</pre>
<h3>Opis:</h3>
<p>Wykryć poprawność wprowadzonego w formie dziesiętnych oktetów IP (w wersji czwartej protokołu).</p>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-ipv4/index.php"  title="Przykład walidacji adresu IPv4">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>0.0.0.0</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>101.256.0.1 (drugi oktet poza zakresem)</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$ipv4 = trim('192.168.0.1');
if ( !preg_match('/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/Du', $ipv4) )
{
	print 'Nieprawidłowy adres IPv4';
}</pre>
<h3>Rozwiązanie oparte o <a target="_blank" href="http://pl2.php.net/filter_var"  title="Specyfikacja filter_var()">filter_var</a> (PHP >= 5.2):</h3>
<pre class="brush: php; title: ;">$ipv4 = trim('192.168.0.1');
if ( (bool)filter_var($ipv4, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === false )
{
	print 'Nieprawidłowy adres IPv4';
}</pre>
<h2>6. Sprawdzamy adres IP z wykluczeniem puli prywatnych adresów (protokół IPv4)</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/^([1-9]{1}[1-9]{0,1}|1\d([1-6]{1}|[8-9]{1})|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])$/Du</pre>
<h3>Opis:</h3>
<p>Wykryć poprawność wprowadzonego IP (w wersji czwartej protokołu) z wykluczeniem części prywatnych i zastrzeżonych pul. Metoda nie dotyczy masek podsieci. Objęte wyjątki:</p>
<ul>
<li>10.0.0.0 &#8211; 10.255.255.255,</li>
<li>0.0.0.0 &#8211; 0.255.255.255,</li>
<li>255.255.255.255,</li>
<li>127.0.0.0 &#8211; 127.255.255.255.</li>
</ul>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-ipv4-noprivate/index.php"  title="Przykład walidacji adresu IPv4 z wykluczeniem puli prywatnych adresów">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>192.168.0.136</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>0.0.0.0 (adres prywatny)</p>
<h3>Uwagi:</h3>
<p>Stosując funkcję ze zbioru <strong>filter_*</strong> odrzucone zostaną wszystkie zakresy adresów prywatnych i zastrzeżonych (np. 255.255.255.x).</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$ipv4 = trim('68.78.205.0');
if ( !preg_match('/^([1-9]{1}[1-9]{0,1}|1\d([1-6]{1}|[8-9]{1})|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])$/Du', $ipv4) )
{
	print 'Nieprawidłowy adres IPv4';
}</pre>
<h3>Rozwiązanie oparte o <a target="_blank" href="http://pl2.php.net/filter_var"  title="Specyfikacja filter_var()">filter_var</a> (PHP >= 5.2):</h3>
<pre class="brush: php; title: ;">$ipv4 = trim('68.78.205.0');
if ( (bool)filter_var($ipv4, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false )
{
	print 'Nieprawidłowy adres IPv4';
}</pre>
<h2>7. Sprawdzamy adres IP (protokół <a target="_blank" href="http://pl.wikipedia.org/wiki/IPv6"  title="IPv6 - informacje">IPv6</a> i IPv4)</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/^((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}(:|((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))(%.+)?$/Du</pre>
<h3>Opis:</h3>
<p>Wykryć poprawność wprowadzonego IP (w wersji szóstej i czwartej protokołu).</p>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-ipv6/index.php"  title="Przykład walidacji adresu IPv6">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>fe80:0:0:0:0204:61ff:254.157.241.86</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>2001:::db8:: (błędna notacja)</p>
<h3>Uwagi:</h3>
<p>Stosując funkcję ze zbioru <strong>filter_*</strong> odrzucone zostaną wszelkie adresy <a target="_blank" href="http://pl.wikipedia.org/wiki/IPv4"  title="IPv4 - informacje">IPv4</a>. W przedstawionym wyrażeniu regularnym adresy z tej wersji są akceptowane zarówno występując samotnie, jak i w postaci sekwencji czterech ostatnich bajtów w IPv6 (np. :247.125.68.4).</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$ipv6 = trim('fe80::204:61ff:fe9d:f156');
if ( !preg_match('/^((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}(:|((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))(%.+)?$/Du', $ipv6) )
{
	print 'Nieprawidłowy adres IPv6/IPv4';
}</pre>
<h3>Rozwiązanie oparte o <a target="_blank" href="http://pl2.php.net/filter_var"  title="Specyfikacja filter_var()">filter_var</a> (PHP >= 5.2):</h3>
<pre class="brush: php; title: ;">$ipv6 = trim('fe80::204:61ff:fe9d:f156');
if ( (bool)filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false )
{
	print 'Nieprawidłowy adres IPv6';
}</pre>
<h2>8. Wykrywanie kolorów RGB w postaci szesnastkowej</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/^#?[0-9a-f]{3}(?:[0-9a-f]{3})?$/Diu</pre>
<h3>Opis:</h3>
<p>Sprawdzić, czy wprowadzone dane są szesnastkowymi odpowiednikami zapisu kolorów modelu RGB.</p>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-hex-color/index.php"  title="Przykład wykrywania koloru w postaci szesnastkowej">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>#ff0000</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>#a0hfg1 (g i h nie są znakami używanymi przy zapisie heksadecymalnym)</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$hex = trim('#0F15a2');
if ( !preg_match('/^#?[0-9a-f]{3}(?:[0-9a-f]{3})?$/Diu', $hex) )
{
	print 'Nieprawidłowy kod szesnastkowy koloru!';
}</pre>
<h2>9. Proste sprawdzenie nazwy użytkownika</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/^([a-z0-9]{1})([a-z0-9_-]{2,11})$/Diu</pre>
<h3>Opis:</h3>
<p>Wprowadzone dane muszą rozpoczynać się od znaku alfanumerycznego. Kolejne znaki mogą być ponadto myślnikiem lub podkreśleniem. Długość tekstu nie może być większa niż 12ście znaków.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Tekst spełniający warunki:</h3>
<p>m1chu</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>_nick (pierwszy znak nie jest cyfrą, ani literą)</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$username = trim('m1chu');
if ( !preg_match('/^([a-z0-9]{1})([a-z0-9_-]{2,11})$/Diu', $username) )
{
	print 'Nieprawidłowa nazwa użytkownika!';
}</pre>
<h2>10. Proste sprawdzenie hasła użytkownika</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/^(?=[a-z0-9_#@%\*-]*?[A-Z])(?=[a-z0-9_#@%\*-]*?[a-z])(?=[a-z0-9_#@%\*-]*?[0-9])([a-z0-9_#@%\*-]{8,24})$/Diu</pre>
<h3>Opis:</h3>
<p>Wpisane hasło użytkownika musi mieć od ośmiu, do dwudziestu czterech znaków, pośród których musi być co najmniej jedna wielka litera, jedna mała i jedna cyfra. Dodatkowo dozwolone są: <strong>_</strong>, <strong>#</strong>, <strong>@</strong>, <strong>%</strong>, <strong>*</strong> i <strong>-</strong>.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Tekst spełniający warunki:</h3>
<p>1xY#n6%2V</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>@1bbd2 (za krótki ciąg, brak wielkiej litery)</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$password = trim('To#jEst@_haSL-o%usera*');
if ( !preg_match('/^(?=[a-z0-9_#@%\*-]*?[A-Z])(?=[a-z0-9_#@%\*-]*?[a-z])(?=[a-z0-9_#@%\*-]*?[0-9])([a-z0-9_#@%\*-]{8,24})$/Diu', $password) )
{
	print 'Nieprawidłowa nazwa użytkownika!';
}</pre>
<h2>11. Zaznaczanie frazy w tekście</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/\b(fraza)\b/iu</pre>
<h3>Opis:</h3>
<p>Zamienianie podanej frazy na inną lub wystylowanie jej formy. Przydatna funkcja w wyszukiwarkach.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Działanie:</h3>
<p>szukana_fraza -> <strong>szukana_fraza</strong></p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$text = 'Wyszukane frazy: wyrażenia, regularne, preg_match, preg_replace';
$find = 'regularne';
print preg_replace('/\b(' . $find . ')\b/iu', '&lt;strong&gt;\\1&lt;/strong&gt;', $text);</pre>
<h3>Rozwiązanie oparte o <a target="_blank" href="http://pl2.php.net/manual/en/function.str-ireplace.php"  title="Specyfikacja str_ireplace()">str_ireplace</a>:</h3>
<pre class="brush: php; title: ;">$text = 'Wyszukane frazy: wyrażenia, regularne, preg_match, preg_replace';
$find = 'regularne';
print str_ireplace($find, '&lt;strong&gt;' . $find . '&lt;/strong&gt;', $text);</pre>
<h2>12. Zamiana tekstowych emotikon na graficzne</h2>
<h3>Opis:</h3>
<p>Podmiana tekstowych uśmieszków na ich odpowiedniki graficzne. Wersja z użyciem <strong>str_ireplace</strong>.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Rozwiązanie oparte o wbudowaną funkcję PHP:</h3>
<pre class="brush: php; title: ;">$text_format = array(
	array(';)', ';-)', 'x)', ';]', ';-]'),
	array(':)', ':-)', '=)', ':]', ':-]'),
	array(':(', ':-(', '=(', ':[', ':-['),
	array(';(', ';-(', 'x(', ';[', ';-['),
	array(':P', ':-P', '=P'),
	array(':D', ':-D', '=D'),
	array(':*', ':-*', '=*'),
	array(':O', ':-O', '=O'),
	array(':/', ':-/', '=/')
	);

$image_format = array(
	'wink.png',
	'smile.png',
	'sad.png',
	'cry.png',
	'tongue.png',
	'bigsmile.png',
	'kiss.png',
	'surprise.png',
	'grimace.png'
	);

$text = 'To jest przykładowy tekst ;] Prawda, że fajny? :-D Pogrymasiłbym trochę =/, ale po co? :) Także do zobaczenia :*';

foreach ( $text_format as $key =&gt; $val )
{
	$text = str_ireplace($val, '&lt;img src=&quot;smiles/' . $image_format[$key] . '&quot; alt=&quot;' . $image_format[$key] . '&quot; /&gt;', $text);
}

print $text;</pre>
<h2>13. Zamiana BBCode na HTML</h2>
<h3>Wzorzec przykładowy:</h3>
<pre class="brush: plain; title: ;">/\[b\](.*?)\[\/b\]/Dius</pre>
<h3>Opis:</h3>
<p>Podmiana BBCode poprzez kod HTML. Funkcjonalność znana z forów internetowych.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Działanie:</h3>
<p>[i]pochylenie[/i] -> <em>pochylenie</em></p>
<h3>Uwagi:</h3>
<p>W komercyjnych projektach należy skorzystać z bardziej zaawansowanych klas do obsługi tego problemu. Pozwoli to uniknąć np. problemu z nieprawidłowym zagnieżdżeniem kilku tagów BBCode w sobie.</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">function bbcode2html($code) {
	$search = array(
        '/\[b\](.*?)\[\/b\]/Dius',
        '/\[i\](.*?)\[\/i\]/Dius',
        '/\[u\](.*?)\[\/u\]/Dius',
        '/\[s\](.*?)\[\/s\]/Dius',
        '/\[img\=(.*?)\](.*?)\[\/img\]/Dius',
        '/\[img\](.*?)\[\/img\]/Dius',
        '/\[url\](.*?)\[\/url\]/Dius',
        '/\[url\=(.*?)\](.*?)\[\/url\]/Dius',
        '/\[color\=(#?([a-f0-9]{6}|[a-f0-9]{3}))\](.*?)\[\/color\]/Dius',
        '/\[size\=([1-9]{1}[0-9]{0,2})(px|pt|em)\](.*?)\[\/size\]/Dius',
    	'/\[font\=([a-z0-9\s&quot;]+)\](.*?)\[\/font\]/Dius',
    );

	$replace = array(
        '&lt;strong&gt;\\1&lt;/strong&gt;',
        '&lt;em&gt;\\1&lt;/em&gt;',
        '&lt;span style=&quot;text-decoration: underline;&quot;&gt;\\1&lt;/u&gt;',
        '&lt;strike&gt;\\1&lt;/strike&gt;',
        '&lt;img src=&quot;\\2&quot; alt=&quot;\\1&quot; /&gt;',
        '&lt;img src=&quot;\\1&quot; alt=&quot;&quot; /&gt;',
        '&lt;a href=&quot;\\1&quot;&gt;\\1&lt;/a&gt;',
        '&lt;a href=&quot;\\1&quot;&gt;\\2&lt;/a&gt;',
        '&lt;span style=&quot;color: \\1;&quot;&gt;\\2&lt;/span&gt;',
        '&lt;span style=&quot;font-size: \\1\\2;&quot;&gt;\\3&lt;/span&gt;',
    	'&lt;span style=&quot;font-family: \\1;&quot;&gt;\\2&lt;/span&gt;'
    );

	return preg_replace($search, $replace, $code);
}</pre>
<h2>14. Sprawdzenie poprawności wprowadzonego kodu pocztowego</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/^[0-9]{2}-?[0-9]{3}$/Du</pre>
<h3>Opis:</h3>
<p>Testowanie poprawności wpisanego kodu pocztowego (w formacie używanym w Polsce). Dozwolone są wersje z myślnikiem pomiędzy drugą i trzecią cyfrą, oraz bez niego.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Tekst spełniający warunki:</h3>
<p>62-150</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>611-10</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$postcode = '61-610';
if ( !preg_match('/^[0-9]{2}-?[0-9]{3}$/Du', $postcode) )
{
	print 'Nieprawidłowy kod pocztowy';
}</pre>
<h2>15. Operowanie na znacznikach XML/XHTML</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain; title: ;">/&lt;([a-z]+)([\s]{1}[^=]+[=]{1}[^&lt;]+)*(?:&gt;(.*)&lt;\/\1&gt;|\s+\/&gt;)/u</pre>
<h3>Opis:</h3>
<p>Sprawdzenie znaczników XML/XHTML oraz pobranie treści znajdującej się pomiędzy nimi.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php; title: ;">$tag = '&lt;a href=&quot;http://m1chu.eu/&quot; title=&quot;m1chu.eu - another devblog&quot;&gt;m1chu.eu&lt;/a&gt; - &lt;strong&gt;another devblog&lt;/strong&gt;';
if ( !preg_match_all('/&lt;([a-z]+)([\s]{1}[^=]+[=]{1}[^&lt;]+)*(?:&gt;(.*)&lt;\/\1&gt;|\s+\/&gt;)/u', $tag, $matches, PREG_PATTERN_ORDER) )
{
	print 'Nieprawidłowa konstrukcja znacznika';
}
else {
	print_r($matches); // print_r($matches[3]) - lista treści zawieranych w tagach
}</pre>
<h2>Słowem zakończenia</h2>
<p>Starałem się jak najdokładniej sprawdzić powyższe wzorce. Nie mniej jednak, jak to zwykle bywa, mogą się w nich znaleźć błędy. Jeżeli ktoś takowe znajdzie, ma jakieś pytania, czy lepsze propozycje to proszę o komentarze pod wpisem.</p>
<p>Jak wspomniałem na wstępie, uruchomiłem serwis pozwalający na sprawdzanie wyrażeń regularnych względem podanego tekstu. Jest on aktualnie w fazie testów, więc mogą występować błędy w jego działaniu. Po zakończeniu wprowadzania poprawek baza wpisów zostanie wyczyszczona do zera. Można go testować, a w przyszłości korzystać pod dwoma adresami:</p>
<ol>
<li><a target="_blank" href="http://regexp.pl/"  title="regexp.pl - tester wyrażeń regularnych"><strong>regexp.pl</strong></a> (adres główny)</li>
<li><a href="http://regexp.m1chu.eu/"  title="regexp.pl - tester wyrażeń regularnych"><strong>regexp.m1chu.eu</strong></a> (adres alternatywny)</li>
</ol>
<p>Pod względem danych sesyjnych obydwa adresy działają niezależnie. <strong>Zapraszam do testowania i wyrażania swojego zdania na moim blogu, w komentarzach tego artykułu.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2009/10/13/15-przydatnych-wyrazen-regularnych-w-php/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

