Foros del Web » Programando para Internet » PHP »

Salto de linea en bbcode

Estas en el tema de Salto de linea en bbcode en el foro de PHP en Foros del Web. Hola. Tengo el siguiente código bbcode: Código PHP: function  bbcode ( $code ) {      $code  =  strip_tags ( $code );      $code  =  nl2br ( ...
  #1 (permalink)  
Antiguo 15/01/2006, 17:39
Avatar de kesthers  
Fecha de Ingreso: mayo-2004
Ubicación: Valencia
Mensajes: 358
Antigüedad: 13 años, 7 meses
Puntos: 2
Salto de linea en bbcode

Hola.
Tengo el siguiente código bbcode:
Código PHP:
function bbcode($code) {
    
$code strip_tags($code);
    
$code nl2br($code);

    
/* ... */

    
$code preg_replace("/\[list\](.*?)\[\/list\]/si""<ul>\\1</ul>"$code);
    
$code preg_replace("/\[list=(.*?)\](.*?)\[\/list\]/si""<ol type=\"\\1\">\\2</ol>"$code);
    
$code str_replace("[*]""<li>"$code);

Si escribo el siguiente texto:
Código:
Línea uno
Línea dos
[ list]
[ *]Uno
[ *]Dos
[ /list]
Bla bla bla
El resultado que obtengo es el siguiente:
Código HTML:
Línea uno<br />
Línea dos<br />
<ul><br />
<li>Uno<br />
<li>Dos<br />
</ul><br />
Bla bla bla
Pero el resultado debería ser:
Código HTML:
Línea uno<br />
Línea dos
<ul>
<li>Uno</li>
<li>Dos</li>
</ul>
Bla bla bla
Que puedo hacer para solucionarlo?

Muchas gracias

Última edición por kesthers; 16/01/2006 a las 02:41
  #2 (permalink)  
Antiguo 15/01/2006, 21:03
 
Fecha de Ingreso: diciembre-2005
Mensajes: 122
Antigüedad: 12 años
Puntos: 0
complicado, no uses nl2br(), prueba

$string = preg_replace ("/\[\*\](.*?)/", "<li>\\1</li>\n", $string)

para los elementos de la lista

los <br/> del resultado que esperas son medio tomado de los pelos, intenta hacer algo como

$string = preg_replace( "/\\\n[^\[]/", "<br/>", $string);

en este momento no recuerdo como se reemplaza los saltos de linea con preg_replace() pero la caracteristica que intentas verificar es que no este al lado de un corchete abierto. espero te sirva.
  #3 (permalink)  
Antiguo 16/01/2006, 02:39
Avatar de kesthers  
Fecha de Ingreso: mayo-2004
Ubicación: Valencia
Mensajes: 358
Antigüedad: 13 años, 7 meses
Puntos: 2
Hola.

Los códigos que me das no acaban de funcionar correctamente.

Así quedaria el código:
Código PHP:
function bbcode($code) {
    
$code strip_tags($code);
    
$code preg_replace"/\\\n[^\[]/""<br/>"$code);

    
/* ... */

    
$code preg_replace("/\[list\](.*?)\[\/list\]/si""<ul>\\1</ul>"$code);
    
$code preg_replace("/\[list=(.*?)\](.*?)\[\/list\]/si""<ol type=\"\\1\">\\2</ol>"$code);
    
$code preg_replace ("/\[\*\](.*?)/""<li>\\1</li>\n"$code);
    
//$code = str_replace("[*]", "<li>", $code);
    
return $code;

Y el resultado es el siguiente:
Código HTML:
Línea uno<br/>ínea dos
<ul>
<li></li>
Uno
<li></li>
Dos
</ul><br/>la bla bla
Alguna idea más?

Muchas gracias.
  #4 (permalink)  
Antiguo 16/01/2006, 05:04
Avatar de kesthers  
Fecha de Ingreso: mayo-2004
Ubicación: Valencia
Mensajes: 358
Antigüedad: 13 años, 7 meses
Puntos: 2
La solución que ofrece plus_ultra esta bien pero habria que solucionar el fallo de que se coma el primer caracter y ademas otro fallo que es el siguiente:

Si escribo con el código de plus_ulta:
Código:
Línea uno
[ b]Línea dos[ /b]
[ list]
[ *]Uno
[ *]Dos
[ /list]
Bla bla bla
El resultado sería:
Código HTML:
Línea uno
<strong>Línea dos</strong>
<ul>
<li></li>
Uno
<li></li>
Dos
</ul><br/>la bla bla
Entre "Línea uno" y "Línea dos" deberia haber un salto de linea.

En conclusión, hay que evitar los saltos de línea cuando se hace una lista, pero en el resto de casos no.

Alguna idea?
Como funciona el bbcode de vbulletin? Alguien tiene el código?

Gracias
  #5 (permalink)  
Antiguo 16/01/2006, 18:49
 
Fecha de Ingreso: diciembre-2005
Mensajes: 122
Antigüedad: 12 años
Puntos: 0
1° "solución" para elementos de lista:
lo que faltaba agregar era el salto de linea
$code = preg_replace ("/\[\*\](.*?)\n/", "<li>\\1</li>\n", $code);
tambien sirve
$code = preg_replace ("/\[\*\]([\w]+)/", "<li>\\1</li>\n", $code);

lo de los saltos de linea es dificil, obtuve un buen resultado con

$code = preg_replace( "/\n([^\[$])/", "<br/>\\1", $code);

pero el problema que existe es que agrega un salto de linea despues de </ul>. trabaja sobre esto.

Última edición por plus_ultra; 16/01/2006 a las 18:55
  #6 (permalink)  
Antiguo 17/01/2006, 06:40
Avatar de kesthers  
Fecha de Ingreso: mayo-2004
Ubicación: Valencia
Mensajes: 358
Antigüedad: 13 años, 7 meses
Puntos: 2
Hola plus_ultra.

La solución al salto de línea que me das tiene el problema de que si despues del salto de linea encuentra por ejemplo un [ b] no me hace el salto, y en ese caso si deberia hacerlo.

La solución sería crear una expresión regular que escriba un <br> siempre que despues de un salto de linea no haya ni un [ list] ni un [ list=*] ni un [ *], en el resto de casos si.

He estado mirando manuales de expresiones regulares para ver si podía conseguirlo pero aun no lo he conseguido.

Alguna idea?
Saludos
  #7 (permalink)  
Antiguo 17/01/2006, 12:00
Avatar de kesthers  
Fecha de Ingreso: mayo-2004
Ubicación: Valencia
Mensajes: 358
Antigüedad: 13 años, 7 meses
Puntos: 2
Sabeis de algún manual de expresioner regulares que me podais recomendar?

Gracias
  #8 (permalink)  
Antiguo 17/01/2006, 20:08
 
Fecha de Ingreso: diciembre-2005
Mensajes: 122
Antigüedad: 12 años
Puntos: 0
http://www.ignside.net/man/php/regex.php

prueba esto:

Código:
function bbcode( $code ) { 
    
	$code = strip_tags( $code ); 
    
    $patterns = array ( "/([^\]])\n([^\[])/",
    					"/\[list\](.*?)\[\/list\]/s",
    					"/\[list=(.*?)\](.*?)\[\/list\]/s",
    					"/\[\*\]([\w]+)/" );

    $replacements = array ( "\\1<br/>\n\\2",
    						"<ul>\\1</ul>",
    						"<ol type=\"\\1\">\\2</ol>",
    						"<li>\\1</li>" );
    
    return preg_replace( $patterns, $replacements, $code); 
}
  #9 (permalink)  
Antiguo 18/01/2006, 14:08
Avatar de kesthers  
Fecha de Ingreso: mayo-2004
Ubicación: Valencia
Mensajes: 358
Antigüedad: 13 años, 7 meses
Puntos: 2
El código de plus_ultra sigue sin funcionar correctamente.

Aunque ahora la cosa se complica mas:

Código:
Línea uno
[ b]Línea dos[/b]
[ list]
[ *]Uno
  [ list]
  [ *]Bla bla
  [ /list]
[ *]Dos
[ /list]
Bla bla bla
El vBulletin lo hace todo correctamente, incluido el salto de línea ¿alguien sabe el código bbcode que usa vBulletin?


Línea uno
Línea dos
  • Uno
    • Bla bla
  • Dos
Bla bla bla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 12:43.