webmaster webmastering webdesign

Jesteś tutaj: webmade.org >> porady >> php + mysql

Mechanizm BBCode

autor: Konrad 'knrdk' Kopciuch, ostatnia modyfikacja: 2007-08-13

szukaj: BBCode BBCode znaczniki formatujące znaczniki formatujące PHP PHP

Co to właściwie jest BBCode ?

Mechanizm BBCode jest to sposób formatowania danych tekstowych pochodzących od użytkowników witryny, pojawiający sie bardzo często na forach dyskusyjnych, czy księgach gości. Ułatwia to modyfikowanie wyglądu wiadomości przez użytkowników nie znających HTML, a jednocześnie podnosi bezpieczeństwo witryny internetowej (użytkownicy nie mogą używać formatowania HTML).

Jak to napisać w PHP ?

Wykorzystamy funkcję preg_replace(), przyjmuje ona jako parametry, ciąg tekstu, wzór według którego ma przeszukiwać przekazany tekst, oraz tekst na który ma zamienić znalezione podciągi. W połączenie w wyrażeniami regularnymi, nadaje sie idealnie do zaimplementowania obsługi BBCode.

Tworzymy więc funkcję o nazwie BBCode, która jako parametr przyjmuje zmienną $tekst, zamienia znaczniki BBCode na kod HTML, i jako wynik działania zwraca tą samą zmienną. Dodatkowo używamy funkcji nl2br() która dodaje znaczniki przejścia do nowej linii, oraz usuwamy znaczniki HTML za pomocą funkcji htmlspecialchars().

function BBCode($tekst){
	$tekst = nl2br($tekst);
	$tekst = htmlspecialchars($tekst);

return($tekst);
}

Na początek zajmiemy sie znacznikami [b],[i],[u] oraz [s]

Do naszej funkcji dodajemy:

$tekst = preg_replace("#\[b\](.*?)\[/b\]#si",'<b>\\1</b>',$tekst);
$tekst = preg_replace("#\[i\](.*?)\[/i\]#si",'<i>\\1</i>',$tekst);
$tekst = preg_replace("#\[u\](.*?)\[/u\]#si",'<u>\\1</u>',$tekst);
$tekst = preg_replace("#\[s\](.*?)\[/s\]#si",'<s>\\1</s>',$tekst);

Jak nietrudno sie domyśleć wzorem (maską) jest pierwszy parametr, drugi definiuje tekst na jaki ma być zamieniony znaleziony wzór, a trzecie do zmienna która ma być przeszukiwana.

Teraz już coś trudniejszego, tagi [img]

//wstawianie obrazków bez tekstu alternatywnego
$tekst = preg_replace("#\[img\](.*?)\[/img\]#si",'<img src="\\1" alt="" />',$tekst);

Powyższy kod pobiera adres obrazka znajdujący się między tagami [img][/img] i zamienia go na kod HTML. We wzorze adres obrazka oznaczony jest wyrażeniem (.*?) , a w drugim parametrze odwołujemy sie do niego poprzez \\1.

Jeśli chcemy umożliwić użytkownikom podawanie opisów alternatywnych zdjeć (alt) należy dopisać.

//wstawianie obrazków z tekstem alternatywnym
$tekst = preg_replace("#\[img=(.*?)\](.*?)\[/img\]#si",'<img src="\\1" alt="\\2" />',$tekst);

Adres obrazka i tekst alternatywny jest oznaczony tym samym wyrażeniem (.*?). Ponieważ pierwszy w wyrażeniu występuje adres to odwołujemy sie do niego poprzez \\1, a do opisu przez \\2 (ponieważ jest drugi w kolejności).

Tagi [color=] i [size=] określają odpowiednio kolor i rozmiar tekstu.

Zasada działania jest identyczna jak w przykładzie z tagiem IMG z opisem alternatywnym.

Najbardziej skomplikowana jest obsługa znaczników [url], oznaczających odnośnik do innej strony internetowej. Należy zapewnić odpowiednie działanie odnośnika, jeśli adres był ponad w formacie http://www.strona.pl, jak i www.strona.pl

Najpierw zajmiemy się pierwszym przykładem (z http)

//odnośnik www - nie dodaje http
$tekst = preg_replace("#\[url\](http.*?)\[/url\]#si", "<A HREF=\"\\1\">\\1</A>", $tekst);

Tutaj zamiast (.*?) zastosowaliśmy (http.*?) Dzięki czemu pasują tylko adresy zaczynające się na http, opis linka jest taki sam jak adres witryny.

//odnośnik www z opisem - nie dodaje http
$tekst = preg_replace("#\[url=(http.*?)\](.*?)\[/url\]#si", "<A HREF=\"\\1\" TARGET=\"_blank\">\\2</A>", $tekst);

Tutaj internauta samodzielnie może zdefiniować opis linka.

Jeśli adres jest podany bez http, czyli zaczyna sie na www to będzie pasował do tego wyrażenia:

//odnośnik www - dodaje http
$tekst = preg_replace("#\[url\](.*?)\[/url\]#si", "<A HREF=\"http://\\1\">\\1</A>", $tekst);

//odnośnik www - dodaje http
$tekst = preg_replace("#\[url=(.*?)\](.*?)\[/url\]#si", "<A HREF=\"http://\\1\">\\2</A>", $tekst);

Należy zwrócić uwagę że do tego wyrażenia pasuje zarówno adres z jak i bez http. Dlatego dla poprawnego działania funkcji musi on być umieszczony po kodzie obsługującym linki z http.

Tagi [quote] czyli cytaty

// cytat bez autora
$tekst = preg_replace("#\[quote\](.*?)\[/quote\]#si",'<blockquote class="cytat">\\1</blockquote>',$tekst);

Kod powyżej działa na identycznej zasadzie co kod odpowiedzialny za zamianę tagów [b]

Kod umożliwiający podanie źródło cytatu wygląda tak

// cytat z autorem
$tekst = preg_replace("#\[quote=(.*?)\](.*?)\[/quote\]#si",'<p><cite>\\1</cite> napisał:</p><blockquote>\\2</blockquote>',$tekst);

I działa on bardzo podobnie jak kod odpowiedzialny za tworzenie linków z opisem.

Pozostał nam już tylko znacznik [code], jego obsługa od tagu [quote] praktycznie różni się tylko nazwą.

//kod
$tekst = preg_replace("#\[code\](.*?)\[/code\]#si",'<pre>\\1</pre>',$tekst);

Konrad 'knrdk' Kopciuch

Osoby czytające tę publikację przeglądały również:

Chcesz zostać programistą?

Poznaj 6 kroków do efektywnej
nauki programowania!

 

valid XHTML
valid CSS
© 2004-2008 copyright by webmade.org