Foros del Web » Programando para Internet » PHP »

Sustituir caracter de una cadena por código html, no otra cadena "<td>"...

Estas en el tema de Sustituir caracter de una cadena por código html, no otra cadena "<td>"... en el foro de PHP en Foros del Web. Buenas Estoy intentando hacer un función que me haga de BBCode y quiero implementar la funcionalidad de crear una tabla. Para ello he pensado que ...
  #1 (permalink)  
Antiguo 19/09/2008, 11:35
Avatar de IMAC/  
Fecha de Ingreso: octubre-2005
Mensajes: 738
Antigüedad: 18 años, 6 meses
Puntos: 14
De acuerdo Sustituir caracter de una cadena por código html, no otra cadena "<td>"...

Buenas

Estoy intentando hacer un función que me haga de BBCode y quiero implementar la funcionalidad de crear una tabla.

Para ello he pensado que se podría hacer así:
[tabla]
[fila]Columna1Fila1 | Columna2Fila1 | Columna3Fila1[/fila]
[fila]Columna1Fila2 | Columna2Fila2 | Columna3Fila2[/fila]
[/tabla]

Todo lo que son [fila] [/fila] y patrones con 2 textos donde el valor del médio se mentiene intacto, no tengo problemas, uso la función preg_replace con 2 arrays.

El problema es que el símbolo | que separa una columna de otra debería de ser sustituido por <td></td> para el código que he programado.
La cuestión es que no se hacerlo mediante los arrays de preg_replace y pensé en usar str_replace(" | ", '</td><td>', $body);

Es aquí donde me viene el problema, la cadena " | " efectivametne se sustituye por "<td></td>, pero no en el código fuente, sino en modo de cadena, de modo que en el código fuente los <td></td> se ven así: "&lt;/td&gt;&lt;td&gt;6%"

¿alguna idea?

PD: uso este código, por si os vale para aclarar mi explicación anterior, el fallo está en mi primera linea:
Código PHP:
  $body str_replace(" | "'</td><td>'$body);

 
$body htmlentities($body);
   
   
   
$a = array(
      
"/\[i\](.*?)\[\/i\]/is",
      
"/\[b\](.*?)\[\/b\]/is",
      
"/\[u\](.*?)\[\/u\]/is",
      
"/\[t\](.*?)\[\/t\]/is",
      
"/\[d\](.*?)\[\/d\]/is",
      
"/\[url=(.*?)\](.*?)\[\/url\]/is",
      
"/\[v\](.*?)\[\/v\]/is",
      
"/\[tabla\](.*?)\[\/tabla\]/is",
      
"/\[fila\](.*?)\[\/fila\]/is",
      
"/\[fila2\](.*?)\[\/fila2\]/is",
      
"/\ | /is"
   
);
   
$b = array(
      
"<i>$1</i>",
      
"<b>$1</b>",
      
"<u>$1</u>",
      
"<b>$1</b><DIV STYLE=\"background-position:bottom; background-image: URL(imgs/linea.gif); background-repeat:repeat-x; height:7\"></div>",
      
"<blockquote><p>$1</p></blockquote>",
      
"<a href=\"$1\" target=\"_blank\">$2</a>",
      
"<a href=\"http://www.youtube.com/watch?v=$1\" target=\"_blank\"><img src='http://img.youtube.com/vi/$1/2.jpg'></a>",
      
"<table width=\"66%\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\" class=\"bordeTabla informacion\">$1</table>",
      
"<tr bgcolor=\"#eeeee1\"><td>$1</td></tr>",
      
"<tr bgcolor=\"#ffffff\"><td>$1</td></tr>",
      
"<td></td>",
   );
   
$body preg_replace($a$b$body);
   
$body nl2br($body); 
Gracias.

Última edición por IMAC/; 19/09/2008 a las 11:42
  #2 (permalink)  
Antiguo 19/09/2008, 11:50
Avatar de emiliodeg  
Fecha de Ingreso: septiembre-2005
Ubicación: Córdoba
Mensajes: 1.830
Antigüedad: 18 años, 7 meses
Puntos: 55
Respuesta: Sustituir caracter de una cadena por código html, no otra cadena "<td>"...

por que no revisas esto y ves si te ahorras de escribir todo
saludos
__________________
Degiovanni Emilio
developtus.com
  #3 (permalink)  
Antiguo 19/09/2008, 11:53
Avatar de emiliodeg  
Fecha de Ingreso: septiembre-2005
Ubicación: Córdoba
Mensajes: 1.830
Antigüedad: 18 años, 7 meses
Puntos: 55
Respuesta: Sustituir caracter de una cadena por código html, no otra cadena "<td>"...

el problema que tienes con el "&lt;/td&gt;&lt;td&gt;6%" es por estas poniendo htmlentities() y te esta pasando el <td> a texto deberias cambiar los | despus del htmlentities si es q realmente hace flata q lo uses
saludos
__________________
Degiovanni Emilio
developtus.com
  #4 (permalink)  
Antiguo 19/09/2008, 11:54
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Sustituir caracter de una cadena por código html, no otra cadena "<td>"...

hay que ver la funcion... por que en realidad, no hay forma de que PHP "escape" por si solo entidades HTML, ya que tu codigo puede hacerlo y tu ni en cuenta....

la otra, es mas sencilla... para lograrlo debes o puedes usar mas funciones, no simples replace...

Código PHP:
<?php

function test1($match)
{
  
$tmp explode('|'$match[1]);
  
$tmp join('</td><td>'$tmp); // OK ?

/*
observa que la salida es siempre
una fila... incluso, lleva una sola 
columna... para permitir a la
funcion "test1" completar
con logia el patron
*/
  
return "<tr><td>$tmp</td></tr>";
}

$str '[tabla]
[fila]Columna1Fila1 | Columna2Fila1 | Columna3Fila1[/fila]
[fila]Columna1Fila2 | Columna2Fila2 | Columna3Fila2[/fila]
[/tabla]'
;

// esta debe ser tu expresion... supongo (s = entre lineas)
$test preg_replace('/\[tabla\](.+?)\[\/tabla\]/is''<table>\\1</table>'$str);

// por filas (m = multilinea)
$test preg_replace_callback('/\[fila\](.+?)\[\/fila\]/im''test1'$test);


// resultado
echo "$test <hr /> <pre>$str</pre>";

?>
suerte!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 19/09/2008, 12:56
Avatar de IMAC/  
Fecha de Ingreso: octubre-2005
Mensajes: 738
Antigüedad: 18 años, 6 meses
Puntos: 14
De acuerdo Respuesta: Sustituir caracter de una cadena por código html, no otra cadena "<td>"...

Muchas gracias pateketrueke, aunque no entiendo esta frase tuya :P

Cita:
Iniciado por pateketrueke Ver Mensaje
hay que ver la funcion... por que en realidad, no hay forma de que PHP "escape" por si solo entidades HTML, ya que tu codigo puede hacerlo y tu ni en cuenta....

He probado tu código y funciona genial, no he usado otras funciones porque aún no manejo tan bien el php como tu :P ni conozco tantas funciones.
Por cierto, ¿cómo haría en este código para que cada fila me saliera de un color como hacía antes?
Usaba [fila][/fila] y [filaR][/filaB] para diferencia un color de otro. (rojo blanco)
En este caso la única cosa que se me ocurre es duplicar las cosas y dejarlo así:

Código PHP:
    // por filas (m = multilinea)
    
$body preg_replace_callback('/\[filaB\](.+?)\[\/filaB\]/im''test1'$body);
   
       
// por filas (m = multilinea)
    
$body preg_replace_callback('/\[filaR\](.+?)\[\/filaR\]/im''test2'$body); 
Y hacer 2 funciones test1 y test2, cada una con un color diferente en el atributo de su TD.

Saludos y gracias de nuevo.
  #6 (permalink)  
Antiguo 19/09/2008, 13:27
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Sustituir caracter de una cadena por código html, no otra cadena "<td>"...

la frase?.... jeje xD

mira, para lograr el efecto que necesitas no debes duplicar codigo, es redundancia pura... :(

mejor, logramos esto con lo siguiente

Código PHP:
function test1($match)
{
  static 
$i 0;

  
$tmp explode('|'$match[1]);
  
$tmp join('</td><td>'$tmp); // OK ?

// par o non?
$odd = ++$i %2'silver''gray';

  return 
"<tr style=\"background-color: $odd\"><td>$tmp</td></tr>";

espero te funcione....
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 19/09/2008, 14:16
Avatar de IMAC/  
Fecha de Ingreso: octubre-2005
Mensajes: 738
Antigüedad: 18 años, 6 meses
Puntos: 14
Respuesta: Sustituir caracter de una cadena por código html, no otra cadena "<td>"...

Vaya, estoy tonto... no me acordaba de las variables globales...
Gracias, la idea la tenía, pero al no tener en cuenta las variables globales se me fue un poco :P

Gracias.
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:35.