Foros del Web » Programando para Internet » PHP »

Eliminar css con preg_replace

Estas en el tema de Eliminar css con preg_replace en el foro de PHP en Foros del Web. Hola a todos/as. Estoy intentando hacer un pequeño script para eliminar ciertas etiquetas html y todas las de css de cara a limpiar el código... ...
  #1 (permalink)  
Antiguo 01/04/2009, 14:08
 
Fecha de Ingreso: noviembre-2007
Mensajes: 90
Antigüedad: 17 años
Puntos: 0
Eliminar css con preg_replace

Hola a todos/as.

Estoy intentando hacer un pequeño script para eliminar ciertas etiquetas html y todas las de css de cara a limpiar el código...

El script es:

<?php
$conectar = fopen ('../thumbs/body.html', 'r');
while(!feof($conectar)){
$buffer = fgetss($conectar,4096,'<body> <hr /> <a> <img>');
$buffer = preg_replace('@<style[^>]*?>.*?</style>@siu','',$buffer);
echo $buffer."<BR>";
}
fclose ($conectar);
?>


El caso.... me borra perfecto las etiquetas html que quiero... pero el css (etiqueta <style..... </style> no se va ni con lejía.

Me llevo muyyyyyyyy mal con las expresiones regulares... de hecho '@<style[^>]*?>.*?</style>@siu' lo he sacado de Internet porque probé con mis propios patrones y na de na... incluso he probado otros que ruedan por Internet con el mismo resultado.

Se trata de eliminar todo lo incluido desde la etiqueta (incluida) <style.... a su cierre </style>

........vamos que no tengo ni idea de por qué no me borra el css....

Una ayuda please
  #2 (permalink)  
Antiguo 01/04/2009, 14:16
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Eliminar css con preg_replace

Mmmm creo tu cadena esta mal declarada, debería de ser así:
Código:
/<style[^>]*?>.*?</style>/
Saludos.
  #3 (permalink)  
Antiguo 01/04/2009, 14:27
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Eliminar css con preg_replace

GatorV, el delimitador no necesariamente tiene que ser /, puede ser cualquier otro caracter.

En cuanto a la pregunta, yo probé esa expresión regular, y funciona sin problemas .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #4 (permalink)  
Antiguo 01/04/2009, 14:49
 
Fecha de Ingreso: noviembre-2007
Mensajes: 90
Antigüedad: 17 años
Puntos: 0
Hola Gator V y David El Grande.

Lo primero de todo gracias por vuestra rápida respuesta.
Acabo de probar con $buffer = $buffer = preg_replace('/<style[^>]*?>.*?</style>/','',$buffer);

y me da el siguiente error:

Warning: preg_replace() [function.preg-replace]: Unknown modifier 't' in....(ruta al script) en la línea que está situado.


...No tengo ni idea de qué puede estar pasando... ¿una caché? ¿EL PATRÓN ESTÁ MAL FORMADO? ni idea.... yo llevo aun la L de novato jejeje.

He probado con otro archivo por si acaso... pero hace lo mismo.... me deja el css felizmente presente en $buffer cuando lo imprimo.... estoy flipando!!!!

Última edición por GatorV; 01/04/2009 a las 15:01
  #5 (permalink)  
Antiguo 01/04/2009, 15:00
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Eliminar css con preg_replace

El patrón estaba bien como estaba. Como te dije, yo lo había probado, y funcionó.

Así que sin ver cuál es el texto específico y qué es lo que no elimina de ella será difícil precisar el problema.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #6 (permalink)  
Antiguo 01/04/2009, 15:02
 
Fecha de Ingreso: noviembre-2007
Mensajes: 90
Antigüedad: 17 años
Puntos: 0
ok ahora te copio el texto a eliminar

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>RSS de soyuncahondo.com</title>
</head>
<body>
<style type="text/css">

h1 a:hover {background-color:#888;color:#fff ! important;}

div#emailbody table#itemcontentlist tr td div ul {
list-style-type:square;
padding-left:1em;
}

div#emailbody table#itemcontentlist tr td div blockquote {
padding-left:6px;
border-left: 6px solid #dadada;
margin-left:1em;
}

div#emailbody table#itemcontentlist tr td div li {
margin-bottom:1em;
margin-left:1em;
}


table#itemcontentlist tr td a:link, table#itemcontentlist tr td a:visited, table#itemcontentlist tr td a:active {
color:#000099;
font-weight:bold;
text-decoration:none;
}

img {border:none;}


</style>
<div xmlns="http://www.w3.org/1999/xhtml" id="emailbody" style="margin:0 2em;font-family:Georgia,Helvetica,Arial,Sans-Serif;line-height:140%;font-size:13px;color:#000000;">
<table style="border:0;padding:0;margin:0;width:100%">
<tr>
<td width="99%" style="vertical-align:top">
<h1 style="margin:0;padding-bottom:6px;">



...etc etc etc

He probado con otros archivos (este en concreto es un email de feedburner mandando actualizaciones en mi web)... y el resultado es el mismo.
Mi servidor es linux con php 5... por si ayuda.



La impresión de $ buffer es:

h1 a:hover {background-color:#888;color:#fff ! important;}

div#emailbody table#itemcontentlist tr td div ul {
list-style-type:square;
padding-left:1em;
}

div#emailbody table#itemcontentlist tr td div blockquote {
padding-left:6px;
border-left: 6px solid #dadada;
margin-left:1em;
}

div#emailbody table#itemcontentlist tr td div li {
margin-bottom:1em;
margin-left:1em;
}


table#itemcontentlist tr td a:link, table#itemcontentlist tr td a:visited, table#itemcontentlist tr td a:active {
color:#000099;
font-weight:bold;
text-decoration:none;
}

img {border:none;}

(La etiqueta <style.... </style> no las imprime.... lo que está entre medias.....ahí lo ves....luego va todo el html límpio y en pantalla correctamente.

Gracias por vuestro interés nuevamente.

Última edición por GatorV; 01/04/2009 a las 15:18
  #7 (permalink)  
Antiguo 01/04/2009, 15:16
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Eliminar css con preg_replace

Qué te puedo decir, también he probado con ese archivo e igual funciona.

Lo que estás haciendo mal es leer el archivo línea a línea, pasarle fgetss, y a la vez tratar de emplear la expresión regular.

Haz esto (leer el archivo de una vez, y aplicar el filtrado deseado):
Código php:
Ver original
  1. $buffer = file_get_contents('../thumbs/body.html');
  2. $buffer = preg_replace('@<style[^>]*?>.*?</style>@siu', '', $buffer);
  3. $buffer = strip_tags($buffer, '<body> <hr /> <a> <img>');
  4. echo $buffer;
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #8 (permalink)  
Antiguo 01/04/2009, 15:41
 
Fecha de Ingreso: noviembre-2007
Mensajes: 90
Antigüedad: 17 años
Puntos: 0
Creo que acabas de dar en el clavo....
Voy probarlo de inmediato.... no caía en que fgetss leía línea a línea y por tanto no podía encontrar nunca el patrón pues estaba en varias.


Muchas pero que muchas gracias por las molestias.

Efectivamente.
Sólo he tenido que agregar la etiqueta <p> en el strip_tags y la salida es límpia y sin estilos.

Esto se merece un gran aplauso.... no era tan fácil caer en lo de leer línea a línea... cuando leí el manual de la función pasé por alto ese dato... así como unas horas que llevo ya con ello.

Última edición por GatorV; 01/04/2009 a las 15:51
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 13:12.