Rss Feed,生成图像

时间:2011-11-26 19:28:26

标签: php rss

我正在尝试使用以下代码在我的网站上生成RSS Feed。 rss出现但我有两个问题:

  1. 当我的页面上显示Feed时,图片没有显示,相反,您会看到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. 如何限制网站上显示的文章数量?

  3. 以下是RSS的链接:Spy 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 个答案:

答案 0 :(得分:1)

endElement()中,在输出Feed内容时,会调用printf("<dt>%s</dt><br><br>",htmlspecialchars(trim($description)));

如果您删除htmlspecialchars功能,则应正确显示图片和其他html,而不是将<转换为&lt;等。

鉴于该代码,没有内置的方法来限制Feed的数量。 Nytimes可能有一个选项,你可以作为查询字符串的一部分传递,限制结果的数量,但我不确定。

快速解决方法是添加一个名为$numShown的全局变量或类似的东西,在endElement()的开头,你可以增加它,并检查它是否高于某些值,如果只是return,则在printf次调用之前输出Feed项。

<?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;
    }
}