PHP-Hispano.net Comunidad hispana de desarrollo web

Contacto | #php_para_torpes | Enlázanos | ¿Quiénes somos?

20 usuarios Online (0)

Darse de alta en la web | Recuperar password   
Inicio / Foros / PHP / Problemas al leer RSS

Problemas al leer RSS

5 respuestas 1257 visitas Categoría PHP

Problemas al leer RSS

Avatar de revolucio
* * * * * * *

(Nivel 2 - 48 posts)

#0 Offline revolucio Usuario 20 abr 08
Buenas, estoy sindicando un RSS en mi web y al hacerlo los caracteres html de la descripción los muestra asi en el codigo:

<a href="http://www.fotolog.com/aaa/26670060"></a><br />

&lt;a href=&quot;http://www.fotolog.com/aaa/26670060&quot;&gt;&lt;img src=&quot;http://sp4.fotologs.net/photo/36/41/91/aaa1204977415_t.jpg&quot; height=&quot;75&quot; width=&quot;100&quot; border=&quot;0&quot; style=&quot;border:none;&quot;/&gt;&lt;/a&gt;

&lt;div&gt;7 de marzu de 2008

&lt;BR&gt;

&lt;BR&gt;

&lt;BR&gt;entamamos!

&lt;BR&gt;

&lt;BR&gt;

&lt;BR&gt;

&lt;BR&gt;

&lt;BR&gt;.&lt;/div&gt;


Como puedo hacer para que lea bien el html?

Gracias.

The power of PHP.

Re: Problemas al leer RSS

Avatar de revolucio
* * * * * * *

(Nivel 2 - 48 posts)

#1 Offline revolucio Usuario 23 abr 08
Alguien me podria ayudar?

:S

The power of PHP.

Re: Problemas al leer RSS

Avatar de krowork
* * * * * * *

(Nivel 3 - 311 posts)

#2 Offline krowork Moderador 23 abr 08
Hola revolucio,

En algún momento estás transformando lo que obtienes con la funcion htmlentities (o htmlspecialchars). Para volver a ponerlo como corresponde tendrías que utilizar la funcion PHP: html_entity_decode - Manual. Aunque lo mejor sería ver donde estas llamando a htmlentities y quitarlo.

http://krowork.blogspot.com

Re: Problemas al leer RSS

Avatar de revolucio
* * * * * * *

(Nivel 2 - 48 posts)

#3 Offline revolucio Usuario 23 abr 08
Hola, gracias por tu respuesta, krowork.

Esta es la función que estoy usando:


<?
       
class RssReader 
        var 
$url
        var 
$data
        
        function 
RssReader ($url){ 
            
$this->url
            
$this->data implode (""file ($url)); 
        } 
        
        function 
get_items (){ 
            
preg_match_all ("/<item .*>.*<\/item>/xsmUi"$this->data$matches); 
            
$items = array (); 
            foreach (
$matches[0] as $match){ 
                
$items[] = new RssItem ($match); 
            } 
            return 
$items
        } 
    } 
    
    class 
RssItem 
        var 
$title$url$description
        
        function 
RssItem ($xml){ 
            
$this->populate ($xml); 
        } 
        
        function 
populate ($xml){ 
            
preg_match ("/<title> (.*) <\/title>/xsmUi"$xml$matches); 
            
$this->title $matches[1]; 
            
preg_match ("/<link> (.*) <\/link>/xsmUi"$xml$matches); 
            
$this->url $matches[1]; 
            
preg_match ("/<description> (.*) <\/description>/xsmUi"$xml$matches); 
            
$this->description $matches[1]; 
    } 
        
    function 
get_title (){ 
        return 
$this->title
        } 
    
        function 
get_url (){ 
        return 
$this->url
        } 
        
        function 
get_description (){ 
            return 
$this->description
        } 
    } 
?>



Y con esto ejecuto X rss:


<?
        $rss 
= new RssReader ("direccionrss"); 
    
    foreach (
$rss->get_items () as $item){ 
        
printf ('<a href="%s">%s</a><br />%s<br /><br />'
        
$item->get_url (), $item->get_title (), $item->get_description ()); 
    
?>



No se que es lo que puede estar imprimiendo mal el Rss.

The power of PHP.

Re: Problemas al leer RSS

Avatar de krowork
* * * * * * *

(Nivel 3 - 311 posts)

#4 Offline krowork Moderador 24 abr 08
revolucio el problema no parece estar en el lector, probablemente el problema está en el script que utilizas para enviar el xml

http://krowork.blogspot.com

Esto es un apaño

Avatar de BartOlo
* * * * * * *

(Nivel 1 - 1 posts)

#5 Offline BartOlo Usuario 17 feb 10
Esto es un apaño pero mira a ver si te vale:


<HTML>
<HEAD>
<TITLE>NOTICIAS</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<?php
    /* COMO EL CÓDIGO ORIGINAL MOSTRABA LA DESCRIPCIÓN DESDE CÓDIGO HTML, HE ELIMINADO ESTÁ PARTE
         CAMBIANDO LAS EXPRESIONE REGULAR DEL preg_match_all  DE LA FUNCIÓN cargaElemento PARA QUE SOLO
       ENCUENTRE CADENAS DE LETRAS
        HE CAMBIADO : preg_match ("/<description> (.*) </description>/xsmUi", $xml, $matches);
        POR:          preg_match ("/<description>([^<p><b><a<A/].*)</description>/xsmUi", $xml, $matches);
                      $this->description = substr($matches[1],9,100);
        Así capturo solo parte de la descripción y extraigo alguna etiqueta

      */  
        
    class RssReader {
        var $url;
        var $data;
        
        function RssReader ($url){
            $this->url;
            $this->data = implode ("", file ($url));
          /* <?php
              $array = array('apellido', 'email', 'telefono');
                $separado_por_comas = implode(",", $array);
                echo $separado_por_comas; // apellido,email,telefono
                ?>     
            La función file de php se encarga de leer un fichero entero
                y devolver una matriz en la que cada elemento de la misma se
                corresponde con una línea del archivo. */

        }
        
        function get_items (){
            preg_match_all ("/<item .*>.*</item>/xsmUi", $this->data, $matches);
          /* int preg_match_all ( string patron, string asunto, array &coincidencias [, int banderas [, int desplazamiento]] )
            Busca el asunto por todas las coincidencias con la expresión regular dada en patron, y las
            coloca en coincidencias en el orden especificado por banderas.Después de que la primera coincidencia
            es encontrada, las búsquedas subsiguientes continúan desde el final de la última coincidencia.
            banderas puede ser una combinación de las siguientes banderas : PREG_PATTERN_ORDER y PREG_SET_ORDER */
          /* Expresión regular:
            
            Esta expresión capta un elemento desde su comienzo hasta el fin marcado por el comienzo del
                  elemento siguiente.

            /<item .*> --> La cadena de expresión regular debe comenzar con /
                                 Un punto en el patrón representa cualquier caracter excepto nueva línea.
                                 El asterísco encuentra coincidencia si el caracter (o grupo de caracteres) que le
                                 precede esta presente 0 o mas veces.
                                 Significa: cualquier elemento seguido de cualquier combinación de caracteres
            .*         --> seguido de cualquier caracter que se repite 0 o más veces
                  
            </item>/  --> Puede suceder que necesitemos incluir en nuestro patrón algun metacaracter como
                                 signo literal, es decir, por si mismo y no por lo que representa. Para indicar
                                 esta finalidad usaremos un carácter de escape, la barra invertida .
                                 Aquí indicamos que el elemento item ha de ir precedido de /.
                                 Finalmente se cierra la expresión con /.
                  xsmUi      --> Modificadores:
                        x: ignora espacios (salvo que esten escapados o incluidos    
                           específicamente dentro del rango de búsqueda. Ignora cualquier caracter
                           despues de almohadilla (#) hasta nueva línea. Sirve para incluir
                           comentarios y hacer mas legible el patrón.  
                        s: representa cualquier carácter incluso el de nueva linea.
                        m: multilínea. Si nuestra cadena contiene varias lineas físicas (n)
                             respeta esos saltos de línea, lo que significa, por ejemplo,
                           que las anclas ^ $ no se aplican al principio y final de la
                           cadena, sino al principio y final de cada linea
                        U: Este modificador invierte la "codicia" de los cuantificadores.
                             Si aplicamos U,  * se convierte en perezoso (lazy) y *? vuelve a su
                           comportamiento normal.
                           Un cuantificador es "codicioso" (greedy) cuando intenta capturar todas
                           las ocurrencias posibles, y perezoso (lazy) cuando captura la
                           ocurrencia mas corta.  */
                                   
          $items = array ();
            foreach ($matches[0] as $match){ // Carga en el array $items todas las coincidencias encontradas por preg_match_all
                $items[] = new RssItem ($match); // Se hace una llamada al constructor de RssItem pasándole cada coincidencia en $match
            }
            return $items;
        }
    }
    
    class RssItem {
        var $title, $url, $description;
        
        function RssItem ($xml){ // El constructor recibe la cadena en bruto (titulo+enlace+descripción)
            $this->cargaElementos ($xml); // y desde la función cargaElementos la descompone en sus tres partes
        }
        
        function cargaElementos ($xml){
            preg_match ("/<title> (.*) </title>/xsmUi", $xml, $matches);
            $this->title = $matches[1];
            preg_match ("/<link> (.*) </link>/xsmUi", $xml, $matches);
            $this->url = $matches[1];
            preg_match ("/<description>([^<p><b><a<A/].*)</description>/xsmUi", $xml, $matches);
            $this->description = substr($matches[1],9,70);
          }

       /* A partir de aquí la clase devuelve cada uno de los tres elementos diferenciados pasándolos por
            la función inconv para evitar problemas con acentos y demás */  
         function get_title (){
        
            $titulo = iconv('UTF-8', 'ISO-8859-1', $this->title);
        return "Noticia: '$titulo'";
       }
    
        function get_url (){
        return iconv('UTF-8', 'ISO-8859-1', $this->url);
        

         }
        
        function get_description (){
          $descripcion = iconv('UTF-8', 'ISO-8859-1', $this->description);
          return $descripcion;
        }
    }
/* Se crea un objeto de la clase RssReader utilizándo como parámetro formal el fichero que file analizará */

$rss = new RssReader ("http://rss.wikio.es/espana/castilla_la_mancha/cuenca.rss");
    
    foreach ($rss->get_items () as $item){
            /* printf imprime las tres cadenas de texto (%s)que hay */
        printf ('<a href="%s">%s</a><br />%s<br /><br />', $item->get_url (),
        $item->get_title (),$item->get_description ());
    }
?>

</HEAD>
<BODY>




</BODY>
</HTML>

Responder mensaje

Para poder participar debes estar registrado e identificado. Si no estás registrado como usuario de PHP-Hispano, :: Registrar ::
Login / Password   

php-hispano.net 2002 - 2010 | XHTML 1.0
Datos Legales | Webmaster