<?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>BBProject.net &#187; regexp</title>
	<atom:link href="http://www.bbproject.net/tag/regexp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bbproject.net</link>
	<description>Programowanie, webmastering, informatyka</description>
	<lastBuildDate>Tue, 01 Mar 2011 20:35:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Piszemy parser BBCode</title>
		<link>http://www.bbproject.net/2009/12/piszemy-parser-bbcode/</link>
		<comments>http://www.bbproject.net/2009/12/piszemy-parser-bbcode/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 09:05:03 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Webmastering]]></category>
		<category><![CDATA[bbcode]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regexp]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=23</guid>
		<description><![CDATA[BBCode jest to język formatowania wiadomości internetowych, pojawiający się często na forach dyskusyjnych. Głównym założeniem tego skryptu jest ułatwienie osobie nieznającej składni HTML odpowiedniego zmodyfikowania wypowiedzi na jej potrzeby. Źródło: http://pl.wikipedia.org/wiki/BBCode Jak dodać obsługę znaczników BBCode do własnej strony, forum czy też systemu komentarzy? Zajmiemy się dziś rozwiązaniem tego problemu przy pomocy wyrażeń regularnych w [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>BBCode jest to język formatowania wiadomości internetowych, pojawiający się często na forach dyskusyjnych. Głównym założeniem tego skryptu jest ułatwienie osobie nieznającej składni HTML odpowiedniego zmodyfikowania wypowiedzi na jej potrzeby.</p>
<p>Źródło: <a href="http://pl.wikipedia.org/wiki/BBCode">http://pl.wikipedia.org/wiki/BBCode</a></p></blockquote>
<p>Jak dodać obsługę znaczników BBCode do własnej strony, forum czy też systemu komentarzy? Zajmiemy się dziś rozwiązaniem tego problemu przy pomocy wyrażeń regularnych w języku PHP.</p>
<p><span id="more-23"></span></p>
<h4>BBCode, wyrażenia regularne</h4>
<p>Wyrażenia regularne służą do zaawansowanego dopasowania szukanej w tekście frazy. Tym razem zaprzęgniemy je do zamiany tagów BBCode, na odpowiedni kod HTML w celu uzyskania pożądanego formatowania.</p>
<p>Znaczników BBCode może być kilka lub kilkadziesiąt <img src='http://www.bbproject.net/wp-includes/images/smilies/icon_wink.png' alt=';)' class='wp-smiley' />  w zależności od implementacji jaką będzie nam dane spotkać, my skupimy się na tych podstawowych jak <strong>pogrubienie</strong>, <em>pochylenie</em>, <span style="text-decoration: underline;">podkreślenie</span> tekstu, zmianę <span style="color: #ff6600;">koloru</span>, rozmiaru oraz tworzenie <a href="http://www.bbproject.net">hiperłączy</a>. Pozostałe, czy nawet swoje własne łatwo dodać bazując na tych podstawowych.</p>
<p>Funkcja służącą do dopasowania wyrażenie regularnego do treści jest <a href="http://pl.php.net/manual/en/function.preg-match.php">preg_match</a>, z kolei do zamiany treści <a href="http://pl.php.net/manual/en/function.preg-replace.php">preg_replace</a>. Nie chcę tutaj skupiać się na tym jak wyglądają/działają wyrażenia regularne, gdyż z pewnością zajęło by to więcej czasu niż napisanie całego parsera BBCode, omówię zatem tylko ogólnie co dane wyrażenie rogi.</p>
<h4>Pogrubienie tekstu</h4>
<p>Zacznijmy zatem od pogrubienia tych treści które zostały opatrzone tagami [b]&#8230;[/b]:</p>
<pre class="brush: php">$text = preg_replace
(
  '|\[b\](.*?)\[/b\]|i',
  '&lt;span style="font-weight: bold;"&gt;\1&lt;/span&gt;',
  $text
);</pre>
<p>Zastosowane wyrażenie regularne:</p>
<pre class="brush: php">|\[b\](.*?)\[/b\]|i</pre>
<p>&#8230;ma za zadanie odszukać wszystkie wystąpienia ciągu [b](dowolny tekst)[/b] i zamienić go na odpowiednie znaczniki HTML (zaopatrzone w styl dodający pogrubienie czcionki). Końcowy przełącznik „i”, sprawa że wielkość liter jest ignorowana, zatem nie ma znaczenia czy użyte taki BBCode będą wpisane z małej czy też dużej litery.</p>
<h4>Zmiana koloru i rozmiaru</h4>
<p>Jak można się domyślić, podobnie wyglądać będzie kod dla pozostałych formatowań. Przejdźmy teraz do znaczników z dodatkowym parametrem, takim jak zmiana koloru ([color=red]&#8230;[/color]) oraz rozmiaru tekstu ([size=16]&#8230;[/size]):</p>
<pre class="brush: php">$text = preg_replace
(
  '|\[color=([a-z]+)\](.*?)\[/color\]|i',
  '&lt;span style="color: \1;"&gt;\2&lt;/span&gt;',
  $text
);

$text = preg_replace
(
  '|\[size=([0-9]+)\](.*?)\[/size\]|i',
  '&lt;span style="font-size: \1px;"&gt;\2&lt;/span&gt;',
  $text
);</pre>
<p>Tym razem wyrażenia regularne wyłuskują 2 parametry jakimi jest rozmiar/kolor tekstu oraz właściwy fragment który należy odpowiednio sformatować.</p>
<h4>Hiperłącza</h4>
<p>I jedyne co pozostało to hiperłącza ([url=moja_strona.pl]&#8230;[/url]):</p>
<pre class="brush: php">$text = preg_replace
(
  '|\[url=(http://)?(.+?)\](.*?)\[/url\]|i',
  '&lt;a href="http://\2"&gt;\3&lt;/a&gt;',
  $text
);</pre>
<p>Dodatkowo, powyższy fragment kodu, sprawdza czy adres został podany z czy też bez przedrostka http://, i przy jego braku dodaje go. Zapewnia to większą uniwersalność działania.</p>
<h4>Gotowe rozwiązanie</h4>
<p>Zbierzmy zatem wszystko w ładną całość w postaci funkcji:</p>
<pre class="brush: php">function bbcode($text)
{
  $patterns = array
  (
    '|\[b\](.*?)\[/b\]|i',
    '|\[i\](.*?)\[/i\]|i',
    '|\[u\](.*?)\[/u\]|i',
    '|\[color=([a-z]+)\](.*?)\[/color\]|i',
    '|\[size=([0-9]+)\](.*?)\[/size\]|i',
    '|\[url=(http://)?(.+?)\](.*?)\[/url\]|i'
  );
  $replacements = array
  (
    '&lt;span style="font-weight: bold;"&gt;\1&lt;/span&gt;',
    '&lt;span style="font-style: italic;"&gt;\1&lt;/span&gt;',
    '&lt;span style="text-decoration: underline;"&gt;\1&lt;/span&gt;',
    '&lt;span style="color: \1;"&gt;\2&lt;/span&gt;',
    '&lt;span style="font-size: \1px;"&gt;\2&lt;/span&gt;',
    '&lt;a href="http://\2"&gt;\3&lt;/a&gt;'
  );
  $text = str_replace("\n", '&lt;br&gt;', trim($text));
  $text = preg_replace($patterns, $replacements, $text);
  return $text;
}</pre>
<p>Najwyższy czas na sprawdzenie jak spisuje się skonstruowana przez nas funkcja. Weźmy przykładowy tekst i przepośćmy go przez funkcję bbcode():</p>
<pre class="brush: plain">Lorem [b]ipsum dolor[/b] sit amet enim. [i]Etiam ullamcorper[/i]. Suspendisse a pellentesque dui, non felis.
Maecenas malesuada elit lectus felis, [u]malesuada[/u] ultricies.
Curabitur et ligula. Ut molestie a, ultricies porta urna.

Vestibulum [color=green]commodo volutpat,[/color] a, convallis ac, laoreet enim. [size=30]P[/size]hasellus fermentum in, dolor.
Pellentesque [url=bbproject.net]facilisis[/url]. Nulla imperdiet sit amet magna.
Vestibulum [size=20][b][color=red]dapibus[/color][/b][/size], mauris nec [b][i][u]malesuada[/u][/i][/b] fames ac turpis velit,
[size=24][url=http://www.bbproject.net]rhoncus[/url][/size] eu, luctus et interdum adipiscing wisi.</pre>
<p>&#8230;i sprawdźmy jej wynik:</p>
<p style="text-align: left;">Lorem <span style="font-weight: bold;">ipsum dolor</span> sit amet enim. <span style="font-style: italic;">Etiam ullamcorper</span>. Suspendisse a pellentesque dui, non felis.<br />
Maecenas malesuada elit lectus felis, <span style="text-decoration: underline;">malesuada</span> ultricies.<br />
Curabitur et ligula. Ut molestie a, ultricies porta urna.</p>
<p style="text-align: left;">Vestibulum <span style="color: green;">commodo volutpat,</span> a, convallis ac, laoreet enim. <span style="font-size: 30px;">P</span>hasellus fermentum in, dolor.<br />
Pellentesque <a href="http://bbproject.net">facilisis</a>. Nulla imperdiet sit amet magna.<br />
Vestibulum <span style="font-size: 20px;"><span style="font-weight: bold;"><span style="color: red;">dapibus</span></span></span>, mauris nec <span style="font-weight: bold;"><span style="font-style: italic;"><span style="text-decoration: underline;">malesuada</span></span></span> fames ac turpis velit,<br />
<span style="font-size: 24px;"><a href="http://www.bbproject.net">rhoncus</a></span> eu, luctus et interdum adipiscing wisi.</p>
<h4 style="text-align: left;">Podsumowanie</h4>
<p>Tym sposobem zakończyliśmy ten krótki przewodnik po BBCode i ich wykorzystaniu przy pomocy wyrażeń regularnych w PHP. Osobiście zachęcam do zgłębienia wiedzy na temat samych wyrażeń regularnych, gdyż jest to potężne narzędzie jeśli wiemy jak się nim posługiwać, a możliwości jego wykorzystania nie kończą się na PHP, gdyż wiele nowoczesnych języków również je obsługuje (czy też nawet niektóre środowiska IDE do wyszukiwania treści).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2009/12/piszemy-parser-bbcode/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

