Własny system BBCode w PHP

Sty 29
2010

bbcodeSystem BBCode najprościej rzecz ujmując polega na zamianie specjalnych znaczników BBCode na odpowiadające mu znaczniki HTML

Przykładowo kod:

[b]tekst[/b]

zostanie zamieniony na:

<b>tekst</b>

Dlaczego na stronach Internetowych używa się tego rodzaju systemu? Przede wszystkim dla wygody użytkownika oraz dla bezpieczeństwa witryny, gdyż znaczniki HTML są filtrowane.

Aby napisać tego typu funkcję wystarczy znajomość dwóch funkcji PHP oraz umiejętność stosowania wyrażeń regularnych. Pierwsza funkcja to str_replace(), druga preg_replace(). Dzięki pierwszej pozbędziemy się przymusowego używania htmlspecialchars(). a dzięki drugiej będziemy zamieniać znaczniki BBCode na HTML’owe odpowiedniki. Poniżej przedstawiam funkcję bbcode(), której sam używam wraz z komentarzami oraz przykładem użycia.

<?php
function bbcode($value)
{
/*zamiast htmlspecialchars()*/
$value = str_replace("<", "&#60 ;", $value);
$value = str_replace(">", "&#62 ;", $value);
/*Pogrubienie tekstu.
[b]Tekst[/b]*/
$value = preg_replace("#[b](.*?)[/b]#si",'<b>\1</b>',$value);
/*Pochylenie tekstu.
[i]Tekst[/i]*/
$value = preg_replace("#[i](.*?)[/i]#si",'<i>\1</i>',$value);
/*Podkreślenie tekstu.
[u]Tekst[/u]*/
$value = preg_replace("#[u](.*?)[/u]#si",'<u>\1</u>',$value);
/*Zagnieżdżenie tekstu do paragrafu.
[p]Tekst[/p]*/
$value = preg_replace("#[p](.*?)[/p]#si",'<p>\1</p>',$value);
/*przykładowa zmiana koloru tekstu na czerwony,
oraz jego pogrubienie.
[czerwony]Tekst[/czerwony]*/
$value = preg_replace("#[czerwony](.*?)[/czerwony]#si",
'<b style="color:red;">\1</b>',$value);
/*Nagłówek <h2>.
[h2]Tekst[/h2]*/
$value = preg_replace("#[h2](.*?)[/h2]#si",'<h2>\1</h2>',$value);
/*Kolor czerwony nagłówka <h2>.
[h2-czerwony]Tekst[/h2]*/
$value = preg_replace("#[h2-czerwony](.*?)[/h2]#si",
'<h2 style="color:red;">\1</h2>',$value);
/*Tworzenie odnośnika.
<a href="adres">Treść wyświetlana</a>*/
$value = preg_replace("#[url=(.*?)](.*?)[/url]#si",
"<a href="\1">\2</a>", $value);
/*Link do portalu YouTube.
[youtube]Identyfikator filmu[/youtube]*/
$value = preg_replace("#[youtube](.*?)[/youtube]#si",
'<object width="425" height="344">
<param name="movie"
value="http://www.youtube.com/v/\1=pl&fs=1&color1=0x3a3a3a&color2=0x999999"></param>
<param name="allowFullScreen"1 value="true"></param>
<param name="allowscriptaccess" value="always"></param>
<embed src="http://www.youtube.com/v/\1=pl&fs=1&color1=0x3a3a3a&color2=0x999999"
type="application/x-shockwave-flash" allowscriptaccess="always"
allowfullscreen="true"
width="425" height="344"></embed></object>',$value);
/*Wyświetlanie obrazków z tekstem alternatywnym.
<img src="adres" alt="Tekst alternatywny" style="max-width:500px;margin:0 auto;display:block;"/>*/
$value = preg_replace("#[img=(.*?)](.*?)[/img]#si",
'<span><img src="obrazki/\1" alt="\2" /></span>',$value);
/*Zwracamy wynik wraz z enterami*/
return nl2br($value);
}
?>

O czym należy pamiętać używając powyższej funkcji na dane wyciągnięte z bazy danych?
-Dane nie mogą być dodawane przy pomocy funkcji htmlspecialchars(), nl2br(), a tylko poprzez addslashes(). Przy ich wyciąganiu należy oczywiście zastosować funkcję stripslashes(), bądź można też zmodyfikować return’a funkcji na:

return stripslashes(nl2br($value));

To tyle, myślę że komuś się przyda. W niektórych miejscach dałem załamanie wiersza, aby kod nie rozwalał strony.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *