缺少标签的 RSS 提要
RSS Feed with Missing Tags
我正在开发一个非常简单的 RSS 提要。我正在做的是从数据库中提取信息并使用 PHP 将其转换为 XML。但是,当我使用 Chrome 查看代码以确保它全部按预期显示时,我在页面顶部收到这些错误。
这是我用来从我的数据库中提取并创建 RSS Feed 的代码。
<?php
include('connectDatabaseScript.php');
$sql = "SELECT * FROM table ORDER BY id DESC";
$query = mysql_query($sql) or die(mysql_error());
header("Content-type: text/xml");
echo "<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0'>
<channel>
<title>My RSS Feed</title>
<link>http://www.mywebsite.com/rss.php</link>
<description>The description for the feed.</description>
<language>en-us</language>";
while($row = mysql_fetch_array($query)) {
$title=$row['title'];
$finalTitle = str_replace("&", "and", $title);
$link=$row['link'];
$newLink = str_replace("&", "&", $link);
$category = $row['category'];
$date = $row['date'];
$description = $row['description'];
echo "<item>
<title>$finalTitle</title>
<link>$newLink</link>
<description>$description</description>
<author>John Doe</author>
<pubDate>$date<pubDate>
<category>$category</category>
</item>";
}
echo "</channel></rss>";
?>
此代码通常会卡在标题标签上。当它这样做时,它将合并 link 并且还可以合并该项目的其余部分和它后面的其他几个项目。这是正在发生的事情的一个例子。
<item>
<title>Title No 415: Title <item>
<title>Title No 291: Another Title</title>
<link>http://www.mywebsite.com/post.php?id=291</link>
<description>description</description>
<author>John Doe</author>
<pubDate>Jan. 1, 2000</pubDate>
<category>Generic</category>
</item>
我已经弄清楚是什么角色导致了这种情况发生。导致问题的是出现在我的某些标题中的“–”字符。我一直在尝试使用 str_replace 函数将其删除。虽然我已经能够成功地将它与“&”一起使用,但它不能与“–”一起使用。是否有另一种解决方案可以摆脱标题中的“–”,或者仍然可以使用 str_replace?
你不应该这样写你的XML。为避免此类错误,您可以使用 DOMDocument
to write your XML, and save it using saveXML
.
我有一些 PHP 脚本可以生成 MySQL 查询并使用它来生成 RSS 提要。 title
和 description
等 RSS 元素的文本需要清理以呈现为 XML.
这里有一个函数可以做到这一点:
function clean_text($in_text) {
return utf8_encode(
htmlspecialchars(
stripslashes($in_text)));
}
我认为一个更简单的函数可能会解决您遇到的问题:
function clean_text($in_text) {
return htmlspecialchars(
stripslashes($in_text));
}
对 utf8_encode()
的调用将 ISO-8859-1 字符串编码为 UTF-8,这对我来说是必需的,因为我在我的数据库中处理 ISO-8859-1 字符编码。 PHP中的htmlspecialchars()函数将&变为&,<变为<和 > 到 >.
下面是一个使用函数输出一些 RSS 的语句:
echo "<description>" . clean_text($row['description']) . "</description>";
我正在开发一个非常简单的 RSS 提要。我正在做的是从数据库中提取信息并使用 PHP 将其转换为 XML。但是,当我使用 Chrome 查看代码以确保它全部按预期显示时,我在页面顶部收到这些错误。
这是我用来从我的数据库中提取并创建 RSS Feed 的代码。
<?php
include('connectDatabaseScript.php');
$sql = "SELECT * FROM table ORDER BY id DESC";
$query = mysql_query($sql) or die(mysql_error());
header("Content-type: text/xml");
echo "<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0'>
<channel>
<title>My RSS Feed</title>
<link>http://www.mywebsite.com/rss.php</link>
<description>The description for the feed.</description>
<language>en-us</language>";
while($row = mysql_fetch_array($query)) {
$title=$row['title'];
$finalTitle = str_replace("&", "and", $title);
$link=$row['link'];
$newLink = str_replace("&", "&", $link);
$category = $row['category'];
$date = $row['date'];
$description = $row['description'];
echo "<item>
<title>$finalTitle</title>
<link>$newLink</link>
<description>$description</description>
<author>John Doe</author>
<pubDate>$date<pubDate>
<category>$category</category>
</item>";
}
echo "</channel></rss>";
?>
此代码通常会卡在标题标签上。当它这样做时,它将合并 link 并且还可以合并该项目的其余部分和它后面的其他几个项目。这是正在发生的事情的一个例子。
<item>
<title>Title No 415: Title <item>
<title>Title No 291: Another Title</title>
<link>http://www.mywebsite.com/post.php?id=291</link>
<description>description</description>
<author>John Doe</author>
<pubDate>Jan. 1, 2000</pubDate>
<category>Generic</category>
</item>
我已经弄清楚是什么角色导致了这种情况发生。导致问题的是出现在我的某些标题中的“–”字符。我一直在尝试使用 str_replace 函数将其删除。虽然我已经能够成功地将它与“&”一起使用,但它不能与“–”一起使用。是否有另一种解决方案可以摆脱标题中的“–”,或者仍然可以使用 str_replace?
你不应该这样写你的XML。为避免此类错误,您可以使用 DOMDocument
to write your XML, and save it using saveXML
.
我有一些 PHP 脚本可以生成 MySQL 查询并使用它来生成 RSS 提要。 title
和 description
等 RSS 元素的文本需要清理以呈现为 XML.
这里有一个函数可以做到这一点:
function clean_text($in_text) {
return utf8_encode(
htmlspecialchars(
stripslashes($in_text)));
}
我认为一个更简单的函数可能会解决您遇到的问题:
function clean_text($in_text) {
return htmlspecialchars(
stripslashes($in_text));
}
对 utf8_encode()
的调用将 ISO-8859-1 字符串编码为 UTF-8,这对我来说是必需的,因为我在我的数据库中处理 ISO-8859-1 字符编码。 PHP中的htmlspecialchars()函数将&变为&,<变为<和 > 到 >.
下面是一个使用函数输出一些 RSS 的语句:
echo "<description>" . clean_text($row['description']) . "</description>";