Parsear un RSS y extraer la imagen de un tag img

En la portada de buscatuning que estamos preparando queremos poner noticias del blog. Para eso parseamos el rss del blog gracias a MagpieRSS. Nuestra intención es mostrar una foto de la noticia (si tiene) el titulo y el principio del texto.

Para mostrar una foto es necesario crear una expresion regular (o por lo menos es lo más práctico), por ejemplo ‘src\s*=\s*([\"\'])?(?(1) (.*?)\\1 | ([^\s\>]+))’isx (gracias a cocososo por su ayuda). La expresión regular supone que el atributo imagen va entre comillas y siempre después de img. Es decir algo así <img src="/imagen.gif".

Para cortar al cabo de unos caracteres sin cortar ninguna palabra he usado una función que tiene smarty (si la usas recuerda que tiene licencia GPL)

function truncate($string, $length = 80, $etc = ‘…’,
$break_words = false, $middle = false)
{
if ($length == 0)
return ”;

if (strlen($string) > $length) {
$length -= strlen($etc);
if (!$break_words && !$middle) {
$string = preg_replace(‘/\s+?(\S+)?$/’, ”, substr($string, 0, $length+1));
}
if(!$middle) {
return substr($string, 0, $length).$etc;
} else {
return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
}
} else {
return $string;
}
}

Al final todo junto quedaría algo así:

<?php
/**
* Funcion para truncar un string sin cortar una palabra. De Smarty.php.net (GPL)
*/
function truncate($string, $length = 80, $etc = ‘…’,
$break_words = false, $middle = false)
{
if ($length == 0)
return ”;

if (strlen($string) > $length) {
$length -= strlen($etc);
if (!$break_words && !$middle) {
$string = preg_replace(‘/\s+?(\S+)?$/’, ”, substr($string, 0, $length+1));
}
if(!$middle) {
return substr($string, 0, $length).$etc;
} else {
return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
}
} else {
return $string;
}
}

// MagpieRSS
require_once(‘funciones/magpierss/rss_fetch.inc’);

$url = "http://www.buscatuning.com/blog/feed/";

$rss = fetch_rss($url);

echo "Channel Title: " . $rss->channel['title'] . "<p>";
echo "<ul>";
foreach ($rss->items as $item) {
$href = $item['link'];
$title = $item['title'];
echo "<li>";
echo "<h2><a href=$href>$title</a></h2>";

// Extraemos la imagen de la noticia
preg_match("’< \s*img\s.*?src\s*=\s*([\"\'])?(?(1) (.*?)\\1 | ([^\s\>]+))’isx", $item['content']['encoded'], $resultado );

$img = ( $resultado[3] ) ? $resultado[3] : $resultado[2];

if($img != "")
echo "<img src=’$img’ alt=’$title’ title=’$title’ />";
echo "<p>" . truncate(strip_tags($item['content']['encoded']),100) . "</p>";
echo "</li>";
}
echo "</ul>";

?>

2 pensamientos en “Parsear un RSS y extraer la imagen de un tag img

  1. Pingback: Emilio-Jose Rodríguez García » Incluir fotos de Picasa Web Album (google) en nuestra web

  2. gracias.. funciono perfecto..

    no hubo necesidad de usar la funcion truncate de smarty.. ya que tenia una.

    pero la expresion regular que extrae la etiqueta .. es precisa y justo lo que necesitaba

    se agradece