Rss Feed, генерирующий изображение - PullRequest
0 голосов
/ 26 ноября 2011

Я пытаюсь создать RSS-ленту на своем сайте, используя код ниже. RSS появляется, но у меня есть две проблемы:

  1. Когда на моей странице показывается лента новостей, изображения не отображаются, вместо этого вы видите ссылку img, которая появляется прямо на странице, как эта ... <a href="http://movies.nytimes.com/2011/11/18/movies/garbo-the-spy-about-juan-pujol-garcia-review.html?partner=rssnyt&emc=rss"><img src="http://graphics8.nytimes.com/images/2011/11/18/movies/18RDP_GARBO/18RDP_GARBO-thumbStandard.jpg" border="0" height="75" width="75" hspace="4" align="left"></a>

  2. Как ограничить количество статей, которые появляются на моем сайте?

Вот ссылка на RSS: Шпион RSS FEED Вот код, который я использую:

    <?php
$insideitem = false;
$tag = "";
$title = "";
$description = "";
$link = "";
$locations = array('http://topics.nytimes.com/topics/reference/timestopics/subjects/e/espionage/index.html?rss=1');
srand((float) microtime() * 10000000); // seed the random gen 
$random_key = array_rand($locations);
function startElement($parser, $name, $attrs) {
 global $insideitem, $tag, $title, $description, $link;
 if ($insideitem) {
  $tag = $name;
 } elseif ($name == "ITEM") {
  $insideitem = true;
 }
}
function endElement($parser, $name) {
 global $insideitem, $tag, $title, $description, $link;
 if ($name == "ITEM") {
  printf("<dt><b><a href='%s' target=new>%s</a></b></dt>",
  trim($link),htmlspecialchars(trim($title)));
  printf("<dt>%s</dt><br><br>",htmlspecialchars(trim($description)));
  $title = "";
  $description = "";
  $link = "";
  $insideitem = false;
 }
}
function characterData($parser, $data) {
 global $insideitem, $tag, $title, $description, $link;
 if ($insideitem) {
 switch ($tag) {
  case "TITLE":
  $title .= $data;
  break;
  case "DESCRIPTION":
  $description .= $data;
  break;
  case "LINK":
  $link .= $data;
  break;
 }
 }
}
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
$fp = fopen($locations[$random_key], 'r')
 or die("Error reading RSS data.");
while ($data = fread($fp, 4096))
 xml_parse($xml_parser, $data, feof($fp))
  or die(sprintf("XML error: %s at line %d",
   xml_error_string(xml_get_error_code($xml_parser)),    
   xml_get_current_line_number($xml_parser)));
fclose($fp);
xml_parser_free($xml_parser);
?>

1 Ответ

1 голос
/ 26 ноября 2011

В endElement() при выводе содержимого канала он вызывает printf("<dt>%s</dt><br><br>",htmlspecialchars(trim($description)));

Если вы удалите функцию htmlspecialchars, тогда она должна отображать изображения и другие html должным образом вместо преобразования < в&lt; и т. Д.

Учитывая этот код, не существует встроенного способа ограничения количества каналов.Nytimes может иметь опцию, которую вы можете передать как часть строки запроса, которая ограничивает количество результатов, но я не уверен в этом.

Быстрое решение проблемы - добавить глобальную переменную с именем $numShown иличто-то в этом роде, и в начале endElement() вы можете увеличивать его и проверять, находится ли оно выше некоторого значения, и если да, то просто return перед всеми вызовами printf для вывода элемента фида.

<?php

function endElement($parser, $name) {
    global $insideitem, $tag, $title, $description, $link, $numShown;

    if ($name == "ITEM") {
        $numShown++;

        if ($numShown >= 5) {
            return ;
        }

        printf ( "<dt><b><a href='%s' target=new>%s</a></b></dt>", trim ( $link ), htmlspecialchars ( trim ( $title ) ) );
        printf ( "<dt>%s</dt><br><br>", trim ( $description ) );
        $title = "";
        $description = "";
        $link = "";
        $insideitem = false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...