【问题标题】:Creating RSS Feed using rows containing HTML cause Feed to be blank使用包含 HTML 的行创建 RSS Feed 会导致 Feed 为空
【发布时间】:2011-11-17 09:31:41
【问题描述】:

抱歉,之前有人问过这个问题 - 有一个标题类似的问题,但不是我要找的。​​p>

我正在做的是从数据库中获取结果并将它们打印在适当的标签中以创建 RSS 提要。

唯一的问题是文章的正文包含 html 标记,因此我的 rss 提要无法正确加载。

到目前为止我已经尝试过:

$rssfeed .= '<description>' . htmlentities($row['text') . '</description>';

$rssfeed .= '<description>' . htmlspecialchars($row['text'], ENT_COMPAT, 'UTF-8') . '</description>';

使用其中任何一个只会给我一个完全空白的提要。

其实我也试过了,得到了同样的结果:

$rssfeed .= '<description>' . $row['text']. '</description>';

我现在更困惑了,这应该有效吗?我唯一能想到的是数据库中的行对于 RSS 提要来说太长了,因为它是一个包含文本和 HTML 的完整文章。

我不确定它是否会被自动截断。

有什么想法吗?

更新

这是一些示例输出:

<?xml version="1.0" encoding="UTF-8"?>
    <rss version="2.0">
        <channel>
            <title>RSS feed</title>
            <link>http://www.12345.co.uk</link>
            <description>RSS Feed from 12345.co.uk</description>
            <language>en-uk</language>
            <copyright>Copyright (C) 2011 12345.co.uk</copyright>
            <item>
                <title>Wear safe but stylish sunglasses on the slopes</title>
                <description><![CDATA["<p>Holidaymakers hitting the slopes this year must remember to pack a pair of sunglasses alongside their skis, one expert has highlighted.</p>
                <p>Dharmesh Patel, chairman of the Eyecare Trust, noted that UV protective eyewear is a must for skiers.</p>
                <p>Posted by xxxxx</p>v"]]>
                </description>
                <link></link>
                <pubDate>Mon, 03 Oct 2011 16:57:09 +0000</pubDate>
            </item>

【问题讨论】:

  • 您既不会关闭&lt;channel&gt;,也不会关闭&lt;rss&gt;-tag。
  • 我复制后一定是误删了它——这篇文章很大,所以我只保留了几行——我肯定会在我的 PHP 代码中关闭它们。

标签: php mysql html rss


【解决方案1】:

由于 RSS 是一种 XML 语言,因此您需要使用 CDATA 部分:

<description><![CDATA["<b>Use tags here</b>"]]></description>

在 PHP 中,您可以使用 startCData()endCData() 方法轻松归档此文件(使用 XMLWriter)。

XML-Reader 能否正确显示您的 HTML 取决于它使用的解析器。然而,使用转义序列是valid XML

【讨论】:

  • 我试过了,但似乎没有用——我认为这可能是问题所在。 $rssfeed .= '&lt;description&gt;' . &lt;![CDATA["$row['text']"]]&gt; . '&lt;/description&gt;';
  • 应该是$rssfeed .= '&lt;description&gt;&lt;![CDATA["' .$row['text']. 'v"]]&gt;&lt;/description&gt;'; 此外,您不应该简单地回显整个 XML 结构,而是使用(例如)XMLWriter 来这样做。
  • 谢谢,我在 Firefox 的页面顶部看到了 RSS 位,但提要本身是空白的。真的不知道怎么了:(
  • 现在应该是示例 xml 输出
  • 您是否使用 PHP 将内容类型设置为 text/xml header()-function?
【解决方案2】:

试试 strip_tags($row['text']); http://php.net/manual/en/function.strip-tags.php

更新(我一切正常):

<?php echo '<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>RSS feed</title>
        <link>http://www.12345.co.uk</link>
        <description>RSS Feed from 12345.co.uk</description>
        <language>en-uk</language>
        <copyright>Copyright (C) 2011 12345.co.uk</copyright>
        <item>
            <title>Wear safe but stylish sunglasses on the slopes</title>
            <description><![CDATA["<p>Holidaymakers hitting the slopes this year must remember to pack a pair of sunglasses alongside their skis, one expert has highlighted.</p>
            <p>Dharmesh Patel, chairman of the Eyecare Trust, noted that UV protective eyewear is a must for skiers.</p>
            <p>Posted by xxxxx</p>v"]]>
            </description>
            <link></link>
            <pubDate>Mon, 03 Oct 2011 16:57:09 +0000</pubDate>
        </item>

我不知道为什么,但它只想显示代码结束它:&lt;/channel&gt;&lt;/rss&gt;';?&gt;

【讨论】:

  • 我试过strip_tags,但它似乎没有用。不过谢谢你的想法。
  • 我在 php 文件中尝试过您的代码,如下所示 - 请参阅我的评论中的更新
猜你喜欢
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 2010-11-03
  • 2016-03-29
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
相关资源
最近更新 更多