2010-07-02 45 views
0

我读的文档创建播客饲料suitable for iTunes,并Common Mistakes节说:PHP函数将任意的“描述”成有效的XML数据,播客饲料


使用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 and EntityReferences


现在,我使用PHP5 htmlentities()下和饲料和验证工作。但是从我收集的内容来看,一些可能会被放入内容的东西可能会变成不再有效的实体。用什么最好的功能来保证我不会传递错误的数据?我是偏执狂的东西会得到进入,并获得实体化,并打破饲料 - 我应该只使用str_replace()并取而代之的命名实体,让剩下的独立?或者我可以以某种方式使用htmlspecialchars()

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

回答

2

您可以:

  • 使用CDATA块,而不是(只是确保你使用正确的编码,即XML文件的编码数据的编码相匹配)。唯一需要注意的是]]>,它不能直接放在CDATA块中。
  • 使用mb_encode_numericentity而不是htmlentities(可能与htmlspecialchars结合,以及先前使用mb_convert_encoding解码html entites)。

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

 
&copy; 2005 John Doe 

然后,你可以只是做:

$data = "&copy; 2005 John Doe"; 
$data = mb_convert_encoding($data, "UTF-8", "HTML-ENTITIES"); 
$data = htmlspecialchars($data, ENT_NOQUOTES, "UTF-8"); 
+0

他们的规格具体说了“CDATA节极力劝阻。”所以就这样了。如果我使用'mb_encode_numericentity' http://us3.php.net/mb_encode_numericentity,我传入第二个和第三个参数:'array $ convmap,string $ encoding'?我猜''编码'将是'UTF-8' – artlung 2010-07-02 04:01:34

+0

我已经编辑了解决您的问题的答案:p – Artefacto 2010-07-02 04:14:34

+0

因此,看起来我会继续运行'htmlentities()',然后再运行' mb_convert_encoding()'和'htmlspecialchars()'然后呢?这两个调用基本上是“xml-ize”编码匹配的,是真的吗? – artlung 2010-07-02 05:12:20