BBCode -> HTML

BBCode to HTMLBBCode; forumlar aracılığıyla tanıştığımız, kullanıcıların basit bir şekilde attıkları mesajları biçimlendirebileceği bir işaretleme tipidir. Bu tip bir biçimlendirmenin kullanım nedeni ise direk HTML'e izin verince oluşabilecek güvenlik açıklarıdır. HTML biçimlendirmenin sebep olabileceği açıklar da kapatılabilir tabi ki ama BBCode güvenliği HTML güvenliğini sağlamaktan daha kolaydır. Bu sebeple de BBCode epey rağbet görmüş bir biçimlendirme seçeneği olarak karşımıza çıkmaktadır.

Bu yazımda; içerik yönetim sistemlerinde BBCode'u biçimlendirme olarak kullandığımızda, biçimlendirme olarak BBCode kullanılmış sistemlerden kendi sistemimize veri aktarmak istediğimizde veya buna benzer işlemlerde karşımıza çıkabilecek BBCode'dan HTML'e dönüşüm problemi için yazmış olduğum bir fonksiyonu paylaşacağım.

BBCode -> HTML (BBCode to HTML)

PHP:
  1. /**
  2. * BBCode'dan HTML etiketlerine dönüşüm yapar
  3. *
  4. * @param string $text
  5. * @return string
  6. */
  7. function bbcodeToHTML($text) {
  8. // "\n", düzenli ifade dokularında soruna yol açabiliyor.
  9. $text = str_replace("\n",'',$text);
  10.  
  11. // [code] - [/code], [code:ID] - [/code:ID] to <pre> - </pre>
  12. $text = preg_replace("/\[code(.*)\](.*)\[\/code(.*)\]/U", "<pre>$2</pre>", $text);
  13.  
  14. // [quote] - [/quote], [quote:ID] - [/quote:ID] to <blockquote> - </blockquote>
  15. $text = preg_replace("/\[quote(.*)\](.*)\[\/quote(.*)\]/U", "<blockquote>$2</blockquote>", $text);
  16.  
  17. // [color=COLOR]TEXT[/color], [color=COLOR:ID]TEXT[/color:ID] to <span style="color:COLOR">TEXT</span>
  18. $text = preg_replace("/\[color=(\#[0-9A-F]{6}|[a-z]+):(.*)\](.*)\[\/color(.*)\]/U","<span style=\"color:$1\">$3</span>",$text);
  19. $text = preg_replace("/\[color=(\#[0-9A-F]{6}|[a-z]+)\](.*)\[\/color\]/U","<span style=\"color:$1\">$2</span>",$text);
  20.  
  21. // [size=VALUE]TEXT[/size], [size=VALUE:ID]TEXT[/size:ID] to <span style="font-size:VALUE">TEXT</span>
  22. $text = preg_replace("/\[size=([1-2]?[0-9]):(.*)\](.*)\[\/size(.*)\]/U","<span style=\"font-size:$1\">$3</span>",$text);
  23. $text = preg_replace("/\[size=([1-2]?[0-9])\](.*)\[\/size\]/U","<span style=\"font-size:$1\">$2</span>",$text);
  24.  
  25. // [img]SOURCE[/img], [img:ID]SOURCE[/img:ID] to <img src="SOURCE" />
  26. // NOT! Bu doku [i] etiketini tarayan dokundan önce gelmeli çünkü bu doku [img] etiketine tarayan dokuya etki eder.
  27. $text = preg_replace("/\[img(.*)\]([^?](?:[^\[]+|\[(?!url))*?)\[\/img(.*)\]/U","<img src=\"$2\" />",$text);
  28.  
  29. // Buradaki dokular için phpBB'den yararlanıldı.
  30. // NOT! Bu doku [u] etiketini tarayan dokundan önce gelmeli çünkü bu doku [url] etiketine tarayan dokuya etki eder.
  31. $text = preg_replace("#\[url\]([\w]+?://([\w\#$%&~/.\-;:=,?@\]+]+|\[(?!url=))*?)\[/url\]#is","<a href=\"$1\">$1</a>",$text);
  32. $text = preg_replace("#\[url\]((www|ftp)\.([\w\#$%&~/.\-;:=,?@\]+]+|\[(?!url=))*?)\[/url\]#is","<a href=\"http://$1\">$1</a>",$text);
  33. $text = preg_replace("#\[url=([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*?)\]([^?\n\r\t].*?)\[/url\]#is","<a href=\"$1\" alt=\"$2\">$2</a>",$text);
  34. $text = preg_replace("#\[url=((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*?)\]([^?\n\r\t].*?)\[/url\]#is","<a href=\"http://$1\" alt=\"$3\">$3</a>",$text);
  35.  
  36. // [email]MAIL[/email] to <a href="mailto:MAIL">MAIL</a>
  37. $text = preg_replace("#\[email\]([a-z0-9&\-_.]+?@[\w\-]+\.([\w\-\.]+\.)?[\w]+)\[/email\]#si","<a href=\"mailto:$1\">$1</a>",$text);
  38.  
  39. // [b] - [/b], [b:ID] - [/b:ID] to <b> - </b>
  40. $text = preg_replace("/\[b(.*)\](.*)\[\/b(.*)\]/U", "<b>$2</b>", $text);
  41.  
  42. // [i] - [/i], [i:ID] - [/i:ID] to <i> - </i>
  43. $text = preg_replace("/\[i(.*)\](.*)\[\/i(.*)\]/U", "<i>$2</i>", $text);
  44.  
  45. // [u] - [/u], [u:ID] - [/u:ID] to <u> - </u>
  46. $text = preg_replace("/\[u(.*)\](.*)\[\/u(.*)\]/U", "<u>$2</u>", $text);
  47.  
  48. // Listeleme etiketlerinin dönüşümü
  49. $text = preg_replace("/\[list=([a1])\](.*)\[\/list\]/U","<ol type=\"$1\">$2</ol>",$text);
  50. $text = preg_replace("/\[list=([a1])(.*)\](.*)\[\*(.*)\]/U","<ol type=\"$1\">$3<li>",$text);
  51. $text = preg_replace("/\[\*(.*)\]/U","</li><li>",$text);
  52. $text = preg_replace("/\[\/list:o(.*)\]/U","</li></ol>",$text);
  53. $text = preg_replace("/\[list(.*)\](.*)\[\*(.*)\]/U","<ul>$3<li>",$text);
  54. $text = preg_replace("/\[list(.*)\](.*)\[\/list(.*)\]/U","<ul>$2</ul>",$text);
  55. $text = preg_replace("/\[\/list:u(.*)\]/U","</li></ul>",$text);
  56.  
  57. return $text;
  58.  
  59. }

Bu fonksiyon ile BBCode'dan HTML'e dönüşümün yanında phpBB veritabanından veri çekmeye çalışırsanız karşınıza çıkabilecek özel ID sorunlarından da kurtulabilirsiniz. Test edip, fonksiyonu hataya zorlayanlar olursa sevinirim ;) Ben gerçi elimden geldiğince kontrol ettim ama gözümden kaçanlar olmuştur belki.

Yararlandığım bir kaynak:
BBCode ve Regex (İngilizce)

Ve tabi phpBB'nin kaynak kodlarını burada saygıyla anıyorum :)

Continue reading » · Written on: 04-21-08 · 5 Comments »

5 Responses to “BBCode -> HTML”

  1. Alihan Çetin wrote:

    Eline sağlık Mustafa çok uğraşmışsın.

    Ben hep bu kod örneklerindeki satır numaralarına kıl olurum :) .Çünkü kopyalayıp denemek istediğinde silmek gerekir. Ve eğer Find&Replace yapabilecek Regexp bilginiz yoksa, çok sorun yaratır.(İlk zamanlarımda elimle 100 lerce satır sildiğimi hatırlıyorum :D )
    O yüzden ilk önce aşağıdaki satır numarası silme tiyo-kodunu yazıyorum, satırları silmek isteyen arkadaşlar için:

    $satirsiz = preg_replace("[0-9]{1,}\.\s", "", $kod_alintisi);

    Kodu tabi her detayıyla inceleyemedim ama genel olarak bir problem yok. Dilbilgisi güzel, yorum satırları çok net, bbcode’um iyi değildir, bilen arkadaşlar oradan zorlama yapbilirler Regexp ler için.

    Fonksiyon için teşekkürler
    İyi Çalışmalar…

    April 21st, 2008 at 04:14
  2. Birisi wrote:

    Ben daha iyi bir tüyo yazayim.
    Satır numaralarını silmeye gerek bırakmamak için “plain text” yazısına tıklayarak; satır numaraları olmayan ham kodu alabiliriz.

    November 13th, 2008 at 02:21
  3. Alihan Çetin wrote:

    Eskiden, shapcy başka bir dizayn kullanırken, kod blokunda sol başta satırların numaraları vardı.
    Şimdi shapcy farklı bir kod renklendirici kullandığı için, önceden yazdığım o mesaj anlamsız gibi olmuş.
    Yinede o kod satırı birgün işinize yarayabilir, ya da bir başkasının işine.

    November 14th, 2008 at 03:34
  4. Lida Dai Dai Hua Jiao Nang Seo Yarışması wrote:

    Faydalı bi yazı olmuş lakin forumlarda html kodu kullanımınıda yasakladığımız için benim için değişen bi şey olmayacak.

    November 28th, 2008 at 17:49
  5. erol wrote:

    çok teşekürler.

    September 30th, 2009 at 18:58

Leave a Reply