BBCode en PHP
Quien haya frecuentado foros, esta familiarizado con el BBcode, pero para toda aquella persona que no sepa que significa es a grandes rasgos una serie de etiquetas marcadas con corchetes para dar cierto formato mediante HTML… o segun Wikipedia:
BBCode proveniente del inglés Bulletin Board Code es un pequeño lenguaje usado en los foros para cambiar y editar la forma en que un mensaje (post) es mostrado. BBCode es una colección de marcadores de formato que se usan para cambiar la apariencia del texto en un foro. BBCode está basado en el mismo principio que HTML, y es muy similar a éste.
Ahora bien, veremos como pasar estas etiquetas en BBCode a HTML mediante PHP y su propiedad de usar expresiónes regulares.
Lo primero que hay que ver es que es una expresión regular, lo cual ami no me corresponde y considero aburrido explicarlo. Asi que les dejo de tarea investigarlo. (http://w00t.in/ofd4q)
Bien, ahora necesitamos saber como integrar las expresiones regulares a PHP, esto se puede hacer de diferentes formas para diferentes propositos, ahora, nuestro proposito es reemplazar los codigos BBCode por sus contrapartes en HTML, asi que usaremos preg_replace.
Asi que primero necesitamos definir nuestros patrones en BBCode, yo use los siguientes:
- [b] [/b] convertirá al texto adentro con el estilo de negritas (o bold en ingles).
- [u] [/u] convertirá al texto adentro con el estilo de subrayado (o underlined en ingles).
- [i] [/i] convertirá al texto adentro con el estilo de cursiva (o italics en ingles).
- [color=X] [/color] convertirá al texto adentro con el color dado en X (X= color Hexahedecimal o en Ingles).
- [url=X][/url] convertirá el Texto dentro de la etiqueta a un enlace a X.
- [img][/img] convertirá la url dentro en una imagen válida para el explorador.
Para convertirlos en HTML seria de la siguiente forma respectivamente
- <b></b>
- <u></u>
- <i></i>
- <span style=”color:X”></span>
- <a href=”X”></a>
- <img src=”X” />
Ahora la forma mas sencilla de hacer esto en PHP es mediante arrays, ya que mantiene el orden y es facil de actualizar.
Asi quedarián nuestros Arrays en PHP con expresiones regulares.
$bbcode = array( "/\[i\](.*?)\[\/i\]/is", "/\[b\](.*?)\[\/b\]/is", "/\[u\](.*?)\[\/u\]/is", "/\[img\](.*?)\[\/img\]/is", "/\[url=(.*?)\](.*?)\[\/url\]/is", "/\[color=(.*?)\](.*?)\[\/color\]/is", ); $html = array( "<i>$1</i>", "<b>$1</b>", "<u>$1</u>", "<img src=\"$1\" />", "<a href=\"$1\" target=\"_blank\">$2</a>", "<span style=\"color:$1\">$2</span>", );
Ahora lo que nos falta es integrar los arrays a preg_match, y posteriormente mostrar el texto procesado esto es sencillo ya que automaticametne mantiene el orden y se logra de la siguiente forma:
$texto = preg_replace($bbcode, $html, $texto); return $texto;
Solo faltaria el campo de texto y por seguridad añadir htmlentities ya saben, para protegerse un poco de ataques XSS y nuestra función quedaría asi:
function BBcode($texto){
$bbcode = array(
"/\<(.*?)>/is",
"/\[i\](.*?)\[\/i\]/is",
"/\[b\](.*?)\[\/b\]/is",
"/\[u\](.*?)\[\/u\]/is",
"/\[img\](.*?)\[\/img\]/is",
"/\[url=(.*?)\](.*?)\[\/url\]/is",
"/\[color=(.*?)\](.*?)\[\/color\]/is",
);
$html = array(
"<$1>",
"<i>$1</i>",
"<b>$1</b>",
"<u>$1</u>",
"<img src=\"$1\" />",
"<a href=\"$1\" target=\"_blank\">$2</a>",
"<span style=\"color:$1\">$2</span>",
c
);
$texto = preg_replace($bbcode, $html, $texto);
return $texto;
}
Y aqui queda integrado en un ejemplo:
<?php
function BBcode($texto){
$bbcode = array(
"/\<(.*?)>/is",
"/\[i\](.*?)\[\/i\]/is",
"/\[b\](.*?)\[\/b\]/is",
"/\[u\](.*?)\[\/u\]/is",
"/\[img\](.*?)\[\/img\]/is",
"/\[url=(.*?)\](.*?)\[\/url\]/is",
"/\[color=(.*?)\](.*?)\[\/color\]/is",
);
$html = array(
"<$1>",
"<i>$1</i>",
"<b>$1</b>",
"<u>$1</u>",
"<img src=\"$1\" />",
"<a href=\"$1\" target=\"_blank\">$2</a>",
"<span style=\"color:$1\">$2</span>",
);
$texto = preg_replace($bbcode, $html, $texto);
return $texto;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>BBCode</title>
</head>
<body><p>
<? if (isset($_POST['Enviar'])) {
$texto = ($_POST['texto']);
$texto = BBcode($texto);
echo $texto;
}
else {}
?> </p><hr />
<form method="post" action="#">
<textarea id="texto" name="texto" rows="15" cols="80" style="width: 80%"></textarea><br />
<input type="submit" name="Enviar" id="Enviar" value="Enviar"/>
</form>
</body>
</html>
URL del ejemplo y para descargar, este enlace.
Posts Relacionados
- Color diferente a efectos de texto mediante CSS Para entender el proposito de esta entrada basta con ver...
- Busqueda binaria c++ Buenas.. Creo que no hay que describir mucho en que...
- Creando un CAPTCHA Pués debido a mi entrada anterior, me gustaria dar a...
- Textos Aleatoreos Con este sencillo script en PHP se puede dar a...
- Upload Form en PHP En esta entrada se explicará como hacer un form (ya...
- Enviar un correo con Adjunto mediante PHP Como dice el título de la entrada, hoy abarcaremos de...


