由于子字符串切割html字符,RSS提要无法验证

时间:2011-03-01 14:16:11

标签: validation rss

目前无法通过W3C RSS Validator获取我的RSS Feed以进行验证。似乎时间/日期存在问题。如果单击W3C链接,它将显示错误。当我评论它的日期工作正常,但日期是有点关键!!

这是原始脚本:         

  include "db.php";

  header("Expires: 0");
  header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
  header("cache-control: no-store, no-cache, must-revalidate");
  header("Pragma: no-cache");
  header("Content-type: text/xml");
  print "<?xml version=\"1.0\" encoding=\"utf-8\" ?>";

?>
<rss version="2.0">
  <channel>
    <title>MediWales Events</title>
    <description>The latest Events, updates and announcements from MediWales.</description>
    <link>http://www.mediwales.com</link>
    <copyright>Copyright 2011 MediWales.</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <language>en-us</language>
    <lastBuildDate><? print date("D, d M Y H:i:s"); ?> 0000</lastBuildDate>
    <managingEditor>info@mediwales.com</managingEditor>
    <pubDate><? print date("D, d M Y H:i:s"); ?> 0000</pubDate>

    <webMaster>info@mediwales.com</webMaster>
    <generator>codeworks rss script (1.0.0)</generator>
    <image>
      <url>http://mediwales.com/login/uploaded/template/logo.png</url>
      <title>MediWales Website</title>
      <link>http://www.mediwales.com</link>
      <description>The latest Events, updates and announcements from MediWales.</description>
      <width>144</width>
      <height>52</height>
    </image>


  <?

      $latestnews = mysql_query("SELECT myevents.*, myevents_dates.datefrom from myevents, myevents_dates WHERE myevents_dates.datefrom >= CURDATE() AND myevents.id = myevents_dates.eventid order by myevents_dates.datefrom");
          while ($news = mysql_fetch_assoc($latestnews)) {

              $datetime = explode(" ",$news[datefrom]);
              $date = explode("-",$datetime[0]);
              $time = explode(":",$datetime[1]);
              $news[description] = strip_tags($news[description]);
              $news[description] = htmlspecialchars($news[description]);

              echo "<item>";
              echo "<title>".mb_convert_encoding(htmlspecialchars($news[title]),"US-ASCII")."</title>";
              echo "<description>".mb_convert_encoding(substr($news[description],0, 250),"US-ASCII")."</description>";
              echo "<link>http://www.mediwales.com/index.php?id=4&amp;nid=$news[id]</link>";
              echo "<pubDate>".date('D, d M Y H:i:s O', mktime($time[0],$time[1],$time[2],$date[1],$date[2],$date[0]))."</pubDate>";
              echo "</item>";


          }

  ?>
  </channel>  
</rss>

4 个答案:

答案 0 :(得分:2)

请注意,唯一的错误是在第56行:

nbsp;&</description>

应该是:

nbsp;&amp;</description>

问题是你正在调用htmlspecialchars然后调用substr,所以最后一个&amp;被截断为&amp;,这会使您的Feed无效。首先调用substr,然后调用htmlspecialchars,以解决此问题。

其他的事情(“电子邮件地址缺少真实姓名”,“项目应该包含guid元素”)只是建议:你应该遵循它们,因为它们是好主意,但是它们会使提要无法通过验证。

答案 1 :(得分:0)

您需要修复许多其他错误(例如在HTML实体中间切断)。但它们为每个人提供了帮助链接。

具体参考日期错误,如果您按照其帮助链接,您会看到此警告的可能原因之一是日期是将来的。他们抱怨的日期是“难以置信的日期:星期一,2011年3月7日00:00:00 +0000”。今天是2011年3月1日,所以2011年3月7日确实是未来。

如果你继续阅读他们的Help link,他们会解释为什么这是一个问题。修复不包括Feed中的未来日期。

答案 2 :(得分:0)

我认为他们抱怨你正在使用未来的日期。

如果是这样,那不是,imho,声明您的Feed无效的理由。现实世界的出版物通常会在未来出版。

规范,这是对此的实际权威并未说明将来发布者有任何问题。

http://cyber.law.harvard.edu/rss/rss.html

验证者也可能有错误。 : - )

答案 3 :(得分:0)

我通过在我的实际网站上删除一些html字符暂时解决了这个问题,因此Feed没有抓住它们。

我知道当我们抓住下一组Feed时可能会出现问题,但此刻急于修复。