Comunidad PHPeros
Lenguajes => PHP => Tutoriales PHP => Mensaje iniciado por: naveda en 16 de Diciembre de 2006, 14:41:44 pm
-
Bienvenido a esta 3ª Parte del Tutorial dedicado a la creación de un Sistema de Noticias Simple. En esta 3ª parte voy a ampliar un poco las caracteristicas de las noticias.
Si todo sale bien, al final de este tutorial, el sistema de noticias tendrá:
- Sistema BBCode
- Sistema de Emoticonos
- Sistema de Filtro de Palabras
Bien, Comencemos con el sistema BBCode, para ello crearemos una funcion a la que llamaré bbcode();:
<?PHP
function bbcode($texto) {
$texto = str_replace("\n","<br>",$texto) ; //Saltos de Linea
$texto = str_replace("[b]","<b>",$texto) ; //Negrita
$texto = str_replace("[/b]","</b>",$texto) ; //Negrita
$texto = str_replace("[i]","<i>",$texto) ; //Italic
$texto = str_replace("[/i]","</i>",$texto) ; //Italic
$texto = str_replace("[u]","<u>",$texto) ; //Subrayado
$texto = str_replace("[/u]","</u>",$texto) ; //Subrayado
return $texto;
}
?>
Ahora podrás formatear el texto usando los siguientes TAGS*:
[b]Texto en Negrita[/b]
[i]Texto en Cursiva[/i]
[u]Texto Subrayado[/u]
El sistema BBCode esta acabado, ahora vamos a por el Sistema de Emoticonos. Para ello vamos a ampliar la funcion bbcode y a usarla tambien para el sistema de emoticonos, con esto reduciremos el numero de funciones y con ello la sencillez será mayor.
Supongamos que disponemos de una carpeta llamada smilies con los siguientes emoticonos:
- confundido.gif
- lloron.gif
- pijo.gif
- sonrisa.gif
- sorprendido.gif
<?PHP
function bbcode($texto) {
$texto = str_replace("\n","<br>",$texto); //Saltos de Linea
$texto = str_replace("[b]","<b>",$texto); //Negrita
$texto = str_replace("[/b]","</b>",$texto); //Negrita
$texto = str_replace("[i]","<i>",$texto); //Italic
$texto = str_replace("[/i]","</i>",$texto); //Italic
$texto = str_replace("[u]","<u>",$texto); //Subrayado
$texto = str_replace("[/u]","</u>",$texto); //Subrayado
$texto = str_replace(':S','<img src="smilies/confundido.gif">', $texto);
$texto = str_replace(':)','<img src="smilies/lloron.gif">', $texto);
$texto = str_replace('8)','<img src="smilies/pijo.gif">', $texto);
$texto = str_replace(':D','<img src="smilies/sonrisa.gif">', $texto);
$texto = str_replace(':O','<img src="smilies/sorprendido.gif">', $texto);
return $texto;
}
?>
Ahora con una misma función hemos conseguido un sistema de bbcode y emoticonos, solamente nos falta el Filtro de Palabras que tambien se podría hacer usando la función bbcode(); pero creo conveniente separar el Filtro del sistema BBCODE.
Prosigamos, ahora creare una la funcion filtro_palabras(); que se encargarás de eliminar palabras que no deseemos o insultos... del texto que nosotros queramos, en este caso las noticias.
<?PHP
function filtro_palabras($texto) {
$palabras = array("tonto", "feo", "*****");
$division = explode(" ", $texto);
foreach ($division as $key => $valor) {
foreach ($palabras as $palabra) {
if (strtolower($valor) == $palabra) {
$division[$key] = "[CENSURADO]";
}
}
}
$texto = implode(" ",$division);
return $texto;
}
?>
Ahora disponemos de 2 funciones, bbcode(); y filtro_palabras(); encargadas de realizar las funciones que deseabamos realizar en un principio, ahora solamente nos falta aplicar las funciones al sistema de noticias. Para ello compilaremos las dos funciones en un mismo archivo al que denominaremos funciones.php
funciones.php
<?PHP
function bbcode($texto) {
$texto = str_replace("\n","<br>",$texto); //Saltos de Linea
$texto = str_replace("[b]","<b>",$texto); //Negrita
$texto = str_replace("[/b]","</b>",$texto); //Negrita
$texto = str_replace("[i]","<i>",$texto); //Italic
$texto = str_replace("[/i]","</i>",$texto); //Italic
$texto = str_replace("[u]","<u>",$texto); //Subrayado
$texto = str_replace("[/u]","</u>",$texto); //Subrayado
$texto = str_replace(':S','<img src="smilies/confundido.gif">', $texto);
$texto = str_replace(':)','<img src="smilies/lloron.gif">', $texto);
$texto = str_replace('8)','<img src="smilies/pijo.gif">', $texto);
$texto = str_replace(':D','<img src="smilies/sonrisa.gif">', $texto);
$texto = str_replace(':O','<img src="smilies/sorprendido.gif">', $texto);
return $texto;
}
function filtro_palabras($texto) {
$palabras = array("tonto", "feo", "*****");
$division = explode(" ", $texto);
foreach ($division as $key => $valor) {
foreach ($palabras as $palabra) {
if (strtolower($valor) == $palabra) {
$division[$key] = "[CENSURADO]";
}
}
}
$texto = implode(" ",$division);
return $texto;
}
?>
Ahora que disponemos de este archivo modificaremos algunas partes del archivo noticias.php creado en la 1ª Parte del tutorial:
<?PHP
/* ANTES DE TODO EL CODIGO HAY QUE CONECTAR A LA BASE DE DATOS
include("conectar.php"); <--- Esto es un ejemplo de como conectar...*/
include("funciones.php");
$query = @mysql_query("SELECT * FROM `noticias` ORDER BY `id` DESC"); //Se extraen las noticias en orden reciente
if (@mysql_num_rows($query)) { // Se comprueba si hay alguna noticia publicada
while ($noticia = @mysql_fetch_array($query)) { //Se hace un bucle para mostrar cada noticia una a una
echo '<table border="0" width="100%">
<tr><td align="center">'.filtro_palabras(bbcode($noticia['titulo'])).'</td></tr>
<tr><td>'.filtro_palabras(bbcode($noticia['noticia'])).'</td></tr>
<tr><td>Enviada por '.$noticia['autor'].' || Fecha: '.$noticia['fecha'].'</td></tr>
</table><hr>';
}
} else {
echo "No hay ninguna noticia publicada";
}
@mysql_free_result($noticia); //Se borran los datos usados
?>
Las funciones, del funciones.php, se incluyen en el archivo noticias.php mediante la funcion include(); y se aplican del siguiente modo:
filtro_palabras(bbcode($noticia['titulo']))
filtro_palabras(bbcode($noticia['noticia']))
-
Una consulta, si quiero agregar un bbcode, tendría que ser así?
$texto = str_replace("[ php]","<?php",$texto) ; //Código PHP
$texto = str_replace("[ /php]","?>",$texto) ; //Código PHP
PD: Entre el corchete ([) hay un espacio, ya que no sé podría visualizar bien.
-
Ha ocurrido un error, no se ha procesado la noticia
Me sale esto al enviar la noticia
-
Vamos a ver, por partes.
El BBCode para codigo PHP es mas complejo que esto...
$texto = str_replace("[ php]","<?php",$texto) ; //Código PHP
$texto = str_replace("[ /php]","?>",$texto) ; //Código PHP
Ha ocurrido un error, no se ha procesado la noticia
Me sale esto al enviar la noticia
Esto sucede porque no has conectado con la base de datos...
-
El código url sería asín:
$texto = str_replace("[ url]", "<url>", $texto);
$texto = str_replace("[ /url]", "</url>", $texto);
???
-
Esta bien echo naveda, me gusta :):)
Si os fijais mas o menos todo se basa en lo mismo, crear la funcion y en el bbcode tmb, isha lo as echo bien ;);)
-
Me gusta naveda, esta bien echo y consta de varias cosas :):)
-
porque escribes dos mensajes para escribir lo mismo xD??
-
Porque en el primero me despiste, y te dije que estava bien pero no lo esta
-
Es verdad xD
Si hacemos str_replace ("[url], <url>, $texto"); no funciona ya que el código de las url no es <url> ;)
No se explicar como hacerlo, ni hacerlo así que tendremos que esperar a que alguien que sepa nos ayude ^^
-
Es verdad xD
Si hacemos str_replace ("
Solo estamos haciendo que las palabras, letras, símbolos, o lo que sea, que nosotros queramos se conviertan en HTML...
¿Cómo es un link en HTML? no es <url> sino <a href="http....">, por lo que podríamos poner:
$texto = str_replace("[ url ]","<a href='",$texto) ;
$texto = str_replace("[ /url ]","'>LINK</a>",$texto) ;
saludos ;)
(http://, <url>, $texto"); no funciona ya que el código de las url no es <url> ;)
No se explicar como hacerlo, ni hacerlo así que tendremos que esperar a que alguien que sepa nos ayude ^^
[/quote)
-
El problema es que los enlaces se llamarian siempre LINK y esto podría no ser un correcto funcionamiento...
Bien, un buen metodo podría ser el siguiente:
//Especiales
$texto = eregi_replace("\\[url=([^\\[]*)\\]([^\\[]*)\\[/url\\]",'<a href="\\1">\\2</a>', $texto); //URLs
$texto = eregi_replace("\\[img\\]([^\\[]*)\\[/img\\]",'<img src="\\1">', $texto); //Imagenes
Con la funcion eregi_replace() podemos hacer busquedas de cadenas de texto que siguen unos patrones, en este caso el patron:[url=WEB]Nombre LINK[/url] y [img]url_imagen[/img]
Ahora si aplicais estas lineas al archivo funciones.php podreis ver que funciona correctamente :P
-
Para poner el texto de color, podría ser de la siguiente forma ¿no?
$texto = preg_replace('/\[color=(#?[\w]+)\]/','<span style="color: $1">',$texto) ;
$texto = str_replace('[/color]','</span>',$texto) ;
Y nuestro código seria así
[color=008000]Texto verde[/color]
-
Envia la noticia, sale en la DB... pero no se ve en noticias.php :/
-
Nada nada, ya me va.. :S
Ahora me da error en el panel de admin...
Warning: mysql_query() [function.mysql-query]: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 292
Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 292
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 296
No hay ninguna noticia publicada
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 392
292: $query = mysql_query("SELECT * FROM `noticias_phperos` ORDER BY `id` DESC"); //Se extraen las noticias en orden reciente
296: if (mysql_num_rows($query)) { // Se comprueba si hay alguna noticia publicada
392: mysql_free_result($noticia); //Se borran los datos usados
PD: la tabla que he creado yo es noticias_phperos
-
PD: la tabla que he creado yo es noticias_phperos
La tabla se debe llamar noticias, ya que sí le cambias el nombre tendrías que editar otras cosas más, no sé si será por eso, pero estoy seguro ;)
-
¿pero este sistema de noticias tiene seguridad para que nadie mande noticias sin permiso?
-
Ya está arreglado :D
Era que no habia conectado con la DB... :S
-
Ya está arreglado :D
Era que no habia conectado con la DB... :S
mork yo creo que si le cambias el nombre a la db sin editar archivos, te dara fallos, te lo digo por experiencia...
-
Ya esta arreglado
Los datos es lo primero que cambie ;)
-
el fallo que le veo es que si uno abre por ejemplo la etiqueta de la negrita y no la cierra todo el html a partir de ahí estara con negrita xD
-
que?
-
Pues bien, ahora me a sucedido un bug a mi XD
El sistema, envia la notícia pero el noticias.php no me la lee.
Voy al admin_noticias y funciona, parece que todo está en orden pero el único archivo que faya es el noticias.php que me dice que no hay ninguna noticia publicada..
¿Porque me sucede esto?
EDITADO: Ya está solucionado, esque había canviado el nombre de las tablas y me había olvidado de modificar el noticias.php ;)
-
Warning: mysql_query(): Access denied for user 'admin124830'@'localhost' (using password: NO) in /home/virtual/sitio124830/www/news/admin_noticias.php on line 67
Warning: mysql_query(): A link to the server could not be established in /home/virtual/sitio124830/www/news/admin_noticias.php on line 67
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/virtual/sitio124830/www/news/admin_noticias.php on line 68
No hay ninguna noticia publicada
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home/virtual/sitio124830/www/news/admin_noticias.php on line 81
ami me da este error :S ya cree la tabla en la base de datos i hize el archivo conectar :S
-
Wold segun indica el error, el usuario admin124830 no tiene acceso a la base de datos, configura correctamente los datos de conexion
-
:S los datos los puse bien, se lo enseñe a WarezD@rk :S
-
xd cuando escribo la noticia no sale ni bbcode ni los smilies sale escrito nomas -.-
-
Nada nada, ya me va.. :S
Ahora me da error en el panel de admin...
Warning: mysql_query() [function.mysql-query]: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 292
Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 292
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 296
No hay ninguna noticia publicada
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home/.auggie/heavyland/heavyland.net/pruebas/NOTICIAS_phperos/admin_noticia.php on line 392
292: $query = mysql_query("SELECT * FROM `noticias_phperos` ORDER BY `id` DESC"); //Se extraen las noticias en orden reciente
296: if (mysql_num_rows($query)) { // Se comprueba si hay alguna noticia publicada
392: mysql_free_result($noticia); //Se borran los datos usados
PD: la tabla que he creado yo es noticias_phperos
pues creo que lo de la tabla sale en muchos archivos.. asi que te conviene no cambiarla porque si no la tendras que cambiar en otros achivos o si no no sirve.. creo yo
-
Si es que te das cuenta el problema fue solucionado...
-
Si es que te das cuenta el problema fue solucionado...
cmo? no entendi :S que ya lo arreglaron a sorry xddd
-
xd cuando escribo la noticia no sale ni bbcode ni los smilies sale escrito nomas -.-
los smilies supongo que es porque no has creado la carpeta de smilies con arhdivos con los nombres que salen.. y lo de bbcodes la verdad no lo se
-
wenas a todos/as, soy nuevo por aquí y tengo una duda, se podría implementar el filtro de palabras en el propio formulario ?, me refiero a que el usuario cuando envié el formulario este verifique antes de enviarlo a la db si el contenido de la noticia contiene alguna palabra censurada y en caso de contenerla que le ponga un error del tipo "a utilizado una palabra censurada" o mucho mejor "Las palabras x x x x están censuradas por favor cámbiela/s por otra/s" donde x es la palabra que no queremos, creo que esta forma seria mucho mejor que censurarla en la propia noticia.
Un saludo a todos/as.