0

我正在阅读有关创建适用于 iTunes的播客提要的文档,常见错误部分说:


使用 HTML 命名字符实体。

<! — illegal xml — >
<copyright>&copy; 2005 John Doe</copyright>

<! — valid xml — >
<copyright>&#xA9; 2005 John Doe</copyright>

HTML不同,XML 仅支持五个“命名字符实体”:

character   name               xml
&           ampersand          &amp;
<           less-than sign     &lt;
>           greater-than sign  &gt;
’           apostrophe         &apos;
"           quotation          &quot;

以上五个字符是 XML 中唯一需要转义的字符。所有其他字符都可以直接在支持 UTF-8 的编辑器中输入。您还可以使用为字符指定 Unicode 的数字字符引用,例如:

character   name                       xml
©           copyright sign             &#xA9;
℗           sound recording copyright  &#x2117;
™           trade mark sign            &#x2122;

如需进一步参考,请参阅XML Character 和 EntityReferences


现在我htmlentities()在 PHP5 下使用,并且提要正在验证和工作。但是从我收集到的一些可以放入内容的东西可能会成为使其不再有效的实体。确保我不会传递不良数据的最佳功能是什么?我很偏执,有些东西会被输入并被实体化并破坏提要——我应该只使用str_replace()命名实体并替换为命名实体,而不要管其余部分吗?或者我可以htmlspecialchars()以某种方式使用吗?

简而言之,什么是替代品htmentities(),可以确保播客 RSS 提要中的描述、标题等输入是安全的?

4

1 回答 1

3

您可以:

  • 请改用 CDATA 块(只要确保使用正确的编码,即 XML 文件的编码与数据的编码匹配)。唯一需要注意的是]]>,它不能按字面意思放在 CDATA 块中。
  • 使用mb_encode_numericentity代替htmlentities(可能与htmlspecialcharshtml 实体的先前解码结合使用mb_convert_encoding)。

如果 XML 文件的编码是 UTF-8,则只需删除实体即可。假设您有以下 HTML 片段:

&复制; 2005 年约翰·多伊

然后,你可以这样做:

$data = "&copy; 2005 John Doe";
$data = mb_convert_encoding($data, "UTF-8", "HTML-ENTITIES");
$data = htmlspecialchars($data, ENT_NOQUOTES, "UTF-8");
于 2010-07-02T03:54:33.560 回答