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>