Foros del Web » Programando para Internet » PHP »

Rodear elemento con HTMLpurifier

Estas en el tema de Rodear elemento con HTMLpurifier en el foro de PHP en Foros del Web. Hola... me gustaría poder rodear (wrap) todos los elementos "table" de un html. Hasta ahora estoy usando HTMLpurifier para todo el control del HTML pero ...
  #1 (permalink)  
Antiguo 23/03/2012, 10:02
Avatar de weissbier  
Fecha de Ingreso: febrero-2012
Ubicación: Nella mia casa
Mensajes: 31
Antigüedad: 12 años, 2 meses
Puntos: 1
Rodear elemento con HTMLpurifier

Hola... me gustaría poder rodear (wrap) todos los elementos "table" de un html. Hasta ahora estoy usando HTMLpurifier para todo el control del HTML pero esto último se me hace imposible. Probé usando el set_callback()

Código PHP:
           if ($element->tag=='table'){           
           
$element->outertext "<div style='border:4px solid red;'>" $element->outertext "</div>";
           } 
Pero me muestra solo el div, es como si outertext no contuviese nada. Lo curioso es que si cambio outertext por innertext sí me muestra el texto plano del interior, pero lo que necesito es conservar mi tabla y simplemente envolverla con un div.
  #2 (permalink)  
Antiguo 23/03/2012, 10:56
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 9 meses
Puntos: 105
Respuesta: Rodear elemento con HTMLpurifier

Hay el problema es la librería que estas usando.... dime cual es y tal vez, te puedo ayudar mejor.

Pero si es que fuera "simplehtmldom" ... despues de esa linea, prueba volviendo a asignar el contenido... asi: $html = str_get_html($html);

Suerte
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #3 (permalink)  
Antiguo 23/03/2012, 11:10
Avatar de weissbier  
Fecha de Ingreso: febrero-2012
Ubicación: Nella mia casa
Mensajes: 31
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: Rodear elemento con HTMLpurifier

Gracias, he probado con ello... pero no hace efecto. Es extraño que $element->innertext tenga contenido... y no lo esté la que busco. Supuestamente deben tener el mismo origen. La librería se llama HTMLPurifier. Gracias por la ayuda ;D
  #4 (permalink)  
Antiguo 23/03/2012, 11:14
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 9 meses
Puntos: 105
Respuesta: Rodear elemento con HTMLpurifier

Es que innerText, como bien dice es el "Texto Interno"... entonces no te dara todo como tu lo quieres...
y a quien necesitas es a ourterText, que te dara todo el "Texto Externo".

Si puedes, postea un poco mas de codigo... con solo esa pequeña parte no puedo ayudarte mas.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #5 (permalink)  
Antiguo 23/03/2012, 11:23
Avatar de weissbier  
Fecha de Ingreso: febrero-2012
Ubicación: Nella mia casa
Mensajes: 31
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: Rodear elemento con HTMLpurifier

mmm.. sí, cierto. El problema que tengo es que $element->outertext me aparece como cadena vacía, cuando debería contener todo el elemento. Esta es la función a la que llama el callback:

Código PHP:
      function contCallback($element){
           
//For tables
           
if ($element->tag=='table'){           
           
$element->outertext "<div style='border:1px solid #333;'>" $element->outertext "</div>";
           }
           
//For IMGS
           
if ($element->tag=='img'){
              
$img_src=$element->src;
             
//[...]
           
}
        } 
  #6 (permalink)  
Antiguo 23/03/2012, 14:24
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 9 meses
Puntos: 105
Respuesta: Rodear elemento con HTMLpurifier

Te pedí un poco mas de código, pero vamos... "me diste mucho código" :S
Muestrame el código donde llamas a esa función... es decir, quiero ver cuando creas la variable $element.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #7 (permalink)  
Antiguo 23/03/2012, 16:55
Avatar de weissbier  
Fecha de Ingreso: febrero-2012
Ubicación: Nella mia casa
Mensajes: 31
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: Rodear elemento con HTMLpurifier

jejeje, también es cierto. Bueno, dejaré un bloque completo eliminando las zonas que son prescindibles:

Código PHP:
     //Incluyendo la libreria
       
include(dirname($_SERVER['DOCUMENT_ROOT']) . "/gen_includes/simple_html_dom.php");
    
//Control images on callback
        
function contCallback($element){
        global 
$bdgen;
           
//For tables
           
if ($element->tag=='table'){           
           
$element->outertext "<div style='border:1px solid #333;'>" $element->outertext "</div>";
           }
           
//For IMGS
           
if ($element->tag=='img'){
              
$img_src=$element->src;
              
//[...] Fragmento excluido
           
}
        }
        function 
callback_yt($url){
        global 
$bdgen;
          
parse_strparse_url$url[1], PHP_URL_QUERY ), $url_vars);
          
//register this video (if is not)
            //[...] Fragmento excluido
          
return '<div class="img"><div class="img_opt">Reclamar v&iacute;deo (Opci&oacute;n a&uacute;n no disponible)</div><iframe class="video" src="http://www.youtube.com/embed/' $url_vars['v'] . '" frameborder="0" allowfullscreen></iframe></div>';
        }
        
//HTML DOM parser
        
$html=str_get_html($cont_data['cont']);
        
$html->set_callback('contCallback');
        
$replace_on_fly=preg_replace_callback('/\[YOUTUBE\](.+)\[\/YOUTUBE\]/U','callback_yt',$html);
        
$replace_on_fly=preg_replace('/xK\[([A-Z0-9]+)\]/','<img class="xinl" src="http://woording.com/images/xTras/kb/$1.jpg" />',$replace_on_fly);
        
$replace_on_fly=preg_replace('/xB\[([A-Z]+)\]/','<img class="xinl" src="http://woording.com/images/xTras/bullets/$1.png" />',$replace_on_fly);
          
$pat=array('</p>','<p> </p><div class="img">');
          
$rep=array('</p> ' PHP_EOL,'<div class="img">');
        
$replace_on_fly=str_replace($pat,$rep,$replace_on_fly);
        echo 
$replace_on_fly;
        
?> 
Gracias de antemano, un saludo.
  #8 (permalink)  
Antiguo 26/03/2012, 09:52
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 9 meses
Puntos: 105
Respuesta: Rodear elemento con HTMLpurifier

No se si sera tarde... si ya lo resolviste.... pero bueno, aquí mi respuesta:
Donde esta declarada la variable $cont_data['cont'] ??
Nunca he usado set_callback ... que es lo que pretendes con esto ??
Tu código la verdad es bien complicado.... no se que es lo que realmente quieres....
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #9 (permalink)  
Antiguo 26/03/2012, 10:59
Avatar de weissbier  
Fecha de Ingreso: febrero-2012
Ubicación: Nella mia casa
Mensajes: 31
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: Rodear elemento con HTMLpurifier

jejeje... en realidad todo el proceso es el siguiente:
Los usuarios crean contenidos con un editor WYSIWYG (concretamente tinyMce)
Ahora... siempre, al mostrar ese contenido, justo antes de mostrarlo, se procesa el HTML de los mismos, para:

Reemplazar BBCODE
Reemplazar vídeos (ya sea youtube u otros servicios)
Reemplazar imágenes:
En este caso necesito set_callback para chequear uno a uno si el src de la imagen pertenece a una imagen alojada en MI servidor, y en caso positivo, ver si está bloqueada o no por posibles reclamaciones. Si existe, se muestra la imagen, rodeada de un div, para mostrarla a mi gusto.
Reemplazar tablas:
Necesito insertar cada tabla en un div que lo rodee, para poder mostrarlo a mi gusto (centrado, con su fondo de relleno, etc...) de modo que quede en armonía con las imágenes.
Espero que esto sirva... si hay algún otro modo de hacer el caso de las tablas agradecería me lo comenten. El caso de las imágenes es inevitable puesto que necesito hacer los mencionados chequeos.
  #10 (permalink)  
Antiguo 26/03/2012, 14:59
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 9 meses
Puntos: 105
Respuesta: Rodear elemento con HTMLpurifier

No me contestaste donde declaras o donde se encuentra el valor de $cont_data['cont'].

Y en mi caso, yo no usaria ese set_callback, sino que recorreria todos los tags y ahi uno por uno pregunto por tu tipo y todo lo demas como lo vienes haciendo.

Suerte
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #11 (permalink)  
Antiguo 27/03/2012, 08:21
Avatar de weissbier  
Fecha de Ingreso: febrero-2012
Ubicación: Nella mia casa
Mensajes: 31
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: Rodear elemento con HTMLpurifier

Bueno, $cont_data es una matriz que contiene el resultado del contenido del artículo (HTML) a mostrar. Está definida antes de esas líneas, justamente... y... he comprobado que contiene HTML... es más, el contenido se muestra correctamente, a excepción de las tablas, que las elimina por completo.
¿Cómo hago esa segunda opción, sin usar set_callback?
  #12 (permalink)  
Antiguo 01/04/2012, 07:48
Avatar de weissbier  
Fecha de Ingreso: febrero-2012
Ubicación: Nella mia casa
Mensajes: 31
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: Rodear elemento con HTMLpurifier

Viendo que no puedo hacerlo con la librería DOM... ¿puedo hacerlo con algún tipo de expresiones regulares?
  #13 (permalink)  
Antiguo 01/04/2012, 13:26
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Rodear elemento con HTMLpurifier

Código PHP:
Ver original
  1. //For tables
  2.            if ($element->tag=='table'){          
  3.            $element->outertext = "<div style='border:1px solid #333;'>" . $element->outertext . "</div>";
  4.            }

Haz un var_dump($element); antes y después de modificar el outertext...
Obtienes lo que esperas?
Hay diferencias entre ambas salidas?
Hay errores?


Cita:
Iniciado por masterojitos Ver Mensaje
Nunca he usado set_callback ... que es lo que pretendes con esto ??
Tu código la verdad es bien complicado.... no se que es lo que realmente quieres....
Cita:
Iniciado por masterojitos Ver Mensaje
Y en mi caso, yo no usaria ese set_callback, sino que recorreria todos los tags y ahi uno por uno pregunto por tu tipo y todo lo demas como lo vienes haciendo.
Está claro que no sabes para qué sirve o cómo funciona, entonces porqué recomiendas que no lo use?
__________________
- León, Guanajuato
- GV-Foto
  #14 (permalink)  
Antiguo 06/04/2012, 10:54
Avatar de weissbier  
Fecha de Ingreso: febrero-2012
Ubicación: Nella mia casa
Mensajes: 31
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: Rodear elemento con HTMLpurifier

Gracias por la ayuda. He hecho la prueba, y tras mostrarme miles de líneas del tipo:
Cita:
object(simple_html_dom_node)#22 (9) { ["nodetype"]=> int(1) ["tag"]=> string(5) "table" ["attr"]=> array(0) { } ["children"]=> array(1) { [0]=> object(simple_html_dom_node)#23 (9) { ["nodetype"]=> int(1) ["tag"]=> string(5) "tbody" ["attr"]=> array(0) { } ["children"]=> array(22) { [0]=> object(simple_html_dom_node)#24 (9) { ["nodetype"]=> int(1) ["tag"]=> string(2) "tr" ["attr"]=> array(0) { } ["children"]=> array(5) { [0]=> object(simple_html_dom_node)#25 (9) { ["nodetype"]=> int(1) ["tag"]=> string(2) "th" ["attr"]=> array(0) { } ["children"]=> array(0) { } ["nodes"]=> array(1) { [0]=> object(simple_html_dom_node)#26 (9) { ["nodetype"]=> int(3) ["tag"]=> string(4) "text" ["attr"]=> array(0) { } ["children"]=> array(0) { } ["nodes"]=> array(0) { } ["parent"]=> *RECURSION* ["_"]=> array(1) { [4]=> string(5) "Letra" } ["tag_start"]=> int(0) ["dom:private"]=> object(simple_html_dom)#1 (21) { ["root"]=> object(simple_html_dom_node)#2 (9) { ["nodetype"]=> int(5) ["tag"]=> string(4) "root" ["attr"]=> array(0) { } ["children"]=> array(4) { [0]=> object(simple_html_dom_node)#3 (9) { ["nodetype"]=> int(1) ["tag"]=> string(1) "p" ["attr"]=> array(0) { } ["children"]=> array(3) { [0]=> object(simple_html_dom_node)#4 (9) { ["nodetype"]=> int(1) ["tag"]=> string(4) "span" ["attr"]=> array(1) { ["style"]=> string(14) "color:#339966;" } ["children"]=> array(0) { } ["nodes"]=> array(1) { [0]=> object(simple_html_dom_node)#5 (9) { ["nodetype"]=> int(3) ["tag"]=> string(4) "text" ["attr"]=> array(0) { } ["children"]=> array(0) { }
No encuentro diferencias entre una y la siguiente. Aún así, ¿existe un método menos complejo para envolver tablas en un div? Lo digo porque, ¿para qué quiero que el sistema me recoja todos los subelementos de la tabla, si no voy a trabar con ellos...?
  #15 (permalink)  
Antiguo 06/04/2012, 21:57
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Rodear elemento con HTMLpurifier

Bueno, el objeto no tiene una propiedad outertext, entonces, no puedes modificarla.

Un método menos complejo podría ser str_replace, algo como:

Código PHP:
Ver original
  1. $codigo = str_replace(array('<table', '</table>'), array('<div><table', '</table></div>'), $codigo);

Seguramente no es tan efectivo como manipular directamente el DOM, pero puede servir.
__________________
- León, Guanajuato
- GV-Foto
  #16 (permalink)  
Antiguo 07/04/2012, 05:48
Avatar de weissbier  
Fecha de Ingreso: febrero-2012
Ubicación: Nella mia casa
Mensajes: 31
Antigüedad: 12 años, 2 meses
Puntos: 1
Respuesta: Rodear elemento con HTMLpurifier

Gracias por la rápida solución. Pero, pienso que si en algún momento se hace necesario tratar el DOM de manera más profunda, es mejor hacer las cosas desde el principio. ¿Conoce alguien alguna librería con la que trabajar el DOM que me ofrezca manipular con facilidad este tipo de aspectos? Un saludo.

Etiquetas: elemento, html, tabla
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 17:09.