【问题标题】:PHP & RSS Feeds & Special Characters validation ProblemPHP & RSS Feeds & 特殊字符验证问题
【发布时间】:2011-06-09 19:47:46
【问题描述】:

我不断收到以下验证警告。我想知道我的一些文章涉及特殊字符,并且想知道我应该如何在我的 RSS 提要中渲染或不渲染特殊字符?我应该使用 htmlentites 还是不使用?如果有怎么办?

此外,与 最广泛的提要阅读器可能是 通过实施以下改进 建议。第 22 行,第 35 列: 标题不应包含 HTML:&

PHP 代码。

<title>' . htmlentities(strip_tags($title), ENT_QUOTES, "UTF-8") . '</title>

【问题讨论】:

  • feedvalidator.org(Feedburner 建议使用此站点来验证您的提要)说:“对于最广泛的互操作,RSS 配置文件建议使用十六进制字符引用“&”来表示“& " 和 "<" 代表 "

标签: php rss


【解决方案1】:

您应该使用 CDATA 来转义 XML 提要中的字符,这样您就可以在不破坏 XML 布局的情况下使用原始数据。

试试这个:

<title><![CDATA[ YOUR RAW CONTENT]]></title>

注意:不要使用 htmlentites 和 strip_tags,因为这会为浏览器转义它们,任何其他阅读器都应该正确读取它们。

来自 w3schools 的引用:

术语 CDATA 用于表示不应由 XML 解析器解析的文本数据。 像 "&lt;""&amp;" 这样的字符在 XML 元素中是非法的。 "&lt;" 将产生错误,因为解析器将其解释为新元素的开始。 "&amp;" 将产生错误,因为解析器将其解释为字符实体的开始。 一些文本,比如 JavaScript 代码,包含很多 "&lt;""&amp;" 字符。为避免错误,脚本代码可以定义为 CDATA。 解析器会忽略 CDATA 部分中的所有内容。 CDATA 部分以“”开头:

http://www.w3schools.com/xml/xml_cdata.asp

【讨论】:

  • 使用CDATA时可以保留strip_tags功能吗?
  • CDATA 仅显示 $title 不是最好的主意?
  • 你可能需要回显它,$title 是一个变量,所以你应该有&lt;![CDATA[&lt;?php echo $title ?&gt;]]&gt; 来输出内容。
  • 你能用你当前的代码更新你的问题吗,因为我确定你错过了什么,我的回答应该有效。
  • 如果您在标题中使用 CDATA,feedvalidator.org(Feedburner 建议使用此站点来验证您的提要)会抱怨。不确定这是否是最近的更改,但我今天早上发现了问题。
【解决方案2】:

/* feedvalidator.org(Feedburner 建议使用此站点来验证您的提要)说:“对于最广泛的互操作,RSS 配置文件建议使用十六进制字符引用“&”来表示“&”和“

        // find title problems
        $find[] = '<';
        $find[] = '\x92';
        $find[] = '\x84';

        // find content problems
        $find_c[] = '\x92';
        $find_c[] = '\x84';
        $find_c[] = '&nbsp;';

        // replace title
        $replace[] = '&#x3C;';
        $replace[] = '&#39;';
        $replace[] = '&#34;';

        // replace content
        $replace_c[] = '&#39;';
        $replace_c[] = '&#34;';
        $replace_c[] = ' ';

        // We don't want to re-replace "&" characters.  
        // So do this first because of PHP "feature" https://bugs.php.net/bug.php?id=33773
        $title = str_replace('&', '&#x26;', $title); 
        $title = str_replace($find, $replace, $title);
        $post_content = str_replace($find_c, $replace_c, $row[3]);

        // http://productforums.google.com/forum/#!topic/merchant-center/nIVyFrJsjpk
        $link = str_replace('&', '&amp;', $link);

当然,在将 $title、$post_content 和 $link 添加到我的数据库之前,我会进行一些预处理。但这应该有助于解决一些常见问题以获取有效的 RSS 提要。

更新:修复了 &#x26;#x26; “递归”问题,见https://bugs.php.net/bug.php?id=33773

【讨论】:

  • 非常有用。非常感谢。
【解决方案3】:

取出htmlentities()。它仅适用于 HTML 文件。

【讨论】:

  • 如果您在某个时刻在 html 页面上显示 xml 文件中的标题,那么您可能希望在打印到页面之前使用 htmlentities(),而不是在生成 xml 文件时。
猜你喜欢
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 2013-05-16
  • 2015-12-31
  • 1970-01-01
  • 2020-05-23
  • 2011-02-10
  • 1970-01-01
相关资源
最近更新 更多