Clase BBCode

Creado por richard  el 2014-01-31 16:35:05
Editar


He visto en algunos foros a mas de un usuario preguntando como implementar codigo BBCode en sus proyectos, por esta razon publico esta clase para que tengan un ejemplo de como implementar esta util herramienta que nos permite añdir funcionalidad a nuestros proyectos.
La clase es bastante sencilla pero tambien muy facil de implementar, ademas podran añadirle nuevas mejoras segun sus necesidades.

code: php
class BBCode {
private $_bbcodes = array(
'type1' => array(
'spoiler' => array(
'html' => '<div class="spoiler_container"><div class="spoiler_bar"><input class="i_button" type="button" value="spoiler +" onclick="toogleSpoiler(this);" /></div><div class="spoiler_content">$1</div></div>',
'pattern' => '#\[spoiler](.*?)\[\/spoiler]#is'),
'cite' => array(
'html' => '<div class="cite"><div class="bgclose">$1</div></div>',
'pattern' => '#\[cite](.*?)\[\/cite]#is'),
'shell' => array(
'html' => '<div class="shell">$1</div>',
'pattern' => '#\[shell](.*?)\[\/shell]#is'),
'box' => array(
'html' => '<div class="box">$1</div>',
'pattern' => '#\[box](.*?)\[\/box]#is'),
'text' => array(
'html' => '<div class="text">$1</div>',
'pattern' => '#\[text](.*?)\[\/text]#is'),
'bold' => array(
'html' => '<b>$1</b>',
'pattern' => '#\(.*?)\[\/b]#is'),
'italic' => array(
'html' => '<i>$1</i>',
'pattern' => '#\[i](.*?)\[\/i]#is'),
'underline' => array(
'html' => '<u>$1</u>',
'pattern' => '#\[u](.*?)\[\/u]#is'),
'strike' => array(
'html' => '<strike>$1</strike>',
'pattern' => '#\[strike](.*?)\[\/strike]#is'),
'left' => array(
'html' => '<div style="text-align:left;">$1</div>',
'pattern' => '#\[left](.*?)\[\/left]#is'),
'center' => array(
'html' => '<div style="text-align:center;">$1</div>',
'pattern' => '#\[center](.*?)\[\/center]#is'),
'right' => array(
'html' => '<div style="text-align:right;">$1</div>',
'pattern' => '#\[right](.*?)\[\/right]#is'),
'img' => array(
'html' => '<img style="max-width: 100%" src="$1" alt=""/>',
'pattern' => '#\[img](.*?[\.jpg|\.gif|\.png])\[\/img]#is'),
'url' => array(
'html' => '<a href="$1">$1</a>',
'pattern' => '#\[url](.*?)\[\/url]#is'),
'youtube' => array(
'html' => '<iframe width="640" height="360" src="//www.youtube.com/embed/$1?feature=player_detailpage" frameborder="0" allowfullscreen></iframe>',
'pattern' => '#\[youtube].*\?v=(.*?)\[\/youtube]#is'),
'vimeo' => array(
'html' => '<iframe src="http://player.vimeo.com/video/$1" width="640" height="360" frameborder="0"></iframe>',
'pattern' => '#\[vimeo](.*?)\[\/vimeo]#is')
),
'type2' => array(
'url' => array(
'html' => '<a href="$1">$2</a>',
'pattern' => '#\[url=(.*?)](.*?)\[\/url]#is'),
'size' => array(
'html' => '<font size="$1">$2</font>',
'pattern' => '#\[size=([1-6])\](.*?)\[\/size]#is'),
'color' => array(
'html' => '<font color="$1">$2</font>',
'pattern' => '#\[color=(\#[0-9a-fA-F]{3,6})\](.*?)\[\/color]#is'),
'quote' => array(
'html' => '<div class="quote">Publicado por:$1<br />$2</div>',
'pattern' => '#\[quote=([0-9]{1,6})\](.*?)\[\/quote]#is'),
'code' => array(
'html' => '<div class="code"><b>code: $1</b><pre class="container_code"><code class="$1">$2</code></pre></div>',
'pattern' => '#\[code=(sql|html|css|js|php)](.*?)\[\/code]#is')
)
);

public function toHtml($content) {
$content = htmlentities($content, ENT_QUOTES, 'UTF-8');

$content = $this->replaceBbcodesType1($content);
$content = $this->replaceBbcodesType2($content);
$content = str_replace("\r", '<br />', $content);
# Evita un salto de linea si esta despues de un div de cierre.
$content = str_replace("</div><br />", '</div>', $content);
return $content;
}

/**
* tipo 1 bbocdes simples sin parametros del tipo [b]hola mundo!

*/
public function replaceBbcodesType1($content) {
foreach ($this->_bbcodes['type1'] as $key => $bbcode) {
while (preg_match_all($bbcode['pattern'], $content, $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
$full = $match[0]; # Devuelve todo el patron "hola mundo!"
$expr = $match[1]; # Devuelve la coincidencia del match "hola mundo!"

$newhtml = str_ireplace('$1', $expr, $bbcode['html']);
$content = str_ireplace($full, $newhtml, $content);
}
}
}
return $content;
}

/**
* tipo 2 bbocdes simples con parametros del tipo hola mundo!
*/
public function replaceBbcodesType2($content) {
foreach ($this->_bbcodes['type2'] as $key => $bbcode) {
while (preg_match_all($bbcode['pattern'], $content, $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
$full = $match[0]; # Devuelve todo el patron "hola mundo!"
$param = $match[1]; # Devuelve la coincidencia del 1er match "#0000FF"
$expr = $match[2]; # Devuelve la coincidencia del 2do match "hola mundo!"
if ($key === 'code') {
$expr = trim($expr);
} // Evita que se creen lineas sin codigo al comienzo y al final.
$newhtml = str_ireplace('$1', $param, $bbcode['html']);
$newhtml = str_ireplace('$2', $expr, $newhtml);
$content = str_ireplace($full, $newhtml, $content);
}
}
}
return $content;
}
}

Ejemplo:
code: php
$bbcode = new BBCode();
$result = $bbcode->convert('[b]Hola mundo[ /b]');
echo $result;
obtendremos:
<b>Hola mundo</b>
Servidor Web más utilizado, con mayor número de instalaciones a nivel mundial, es un proyecto de código abierto y uso gratuito, multiplataforma.
Conjunto de datos de un mismo contexto y almacenados sistemáticamente para su posterior uso.
Lenguajes que hacen referencia al codigo de marcado para la elaboración de páginas web.
Potente lenguaje de programación orientado a objetos, independiente del sistema operativo.
Lenguaje interpretado orientado a objetos desarrollado por Netscape que se utiliza en millones de páginas web y aplicaciones de servidor en todo el mundo
Sistema operativo de software libre inspirado en el sistema Unix, escrito por Linus Torvalds con la ayuda de miles de programadores en Internet
El modelado 3D es el proceso de desarrollo de una representación matemática de cualquier objeto tridimensional a través de un software especializado. Al producto se le llama modelo 3D
Lenguaje de programación principalmente orientado al desarrollo web, su código es ejecutado del lado del servidor.
Todo lo que no sea trabajo, solo temas recreativos para divertirse.