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 · 1 Comment »

One Response 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

Leave a Reply