删除&在PHP中写入xml时从字符串

时间:2011-06-16 22:16:51

标签: php xml

我正在尝试使用DOMDocument写入一个包含&的链接的XML文件。标志。 当我尝试这个时,链接变为&在xml中。 因此,从product=1&qty;=1变为product=1&qty;=1

你能告诉我一个避免这种情况的方法吗?

2 个答案:

答案 0 :(得分:5)

&符号应该像这样编码。改变它是错误的。

请参阅http://www.w3.org/TR/xml/

  

&符号(&)和左尖括号(<)绝不能以字面形式显示,除非用作标记分隔符,或在注释,处理指令中,或CDATA部分。如果在其他地方需要它们,则必须分别使用数字字符引用或字符串&<进行转义。

http://www.w3.org/TR/xhtml1/#C_12

  

在SGML和XML中,&符号(“&”)声明实体引用的开头(例如,®表示注册商标符号“®”)。不幸的是,许多HTML用户代理默默地忽略了HTML文档中对&符号字符的错误使用 - 将看起来不像实体引用的&符号视为文字&符号。基于XML的用户代理不会容忍这种不正确的用法,并且任何错误地使用&符号的文档都不会“有效”,因此不符合此规范。为了确保文档与历史HTML用户代理和基于XML的用户代理兼容,文档中用作文字字符的&符号必须表示为实体引用(例如“&” )。例如,当a元素的href属性引用带参数的CGI脚本时,它必须表示为http://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user而不是http://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user

答案 1 :(得分:5)

正如戈登所说,URI是以这种方式编码的。如果你没有将&编码为&,那么XML文件就会搞砸 - 解析它时会出错。当您从XML文件中取回字符串时,如果&amp仍然显示,则str_replace()如下:

$str = str_replace('&', '&', $str)

或使用htmlspecialchars_decode()

$str = htmlspecialchars_decode($str);

使用htmlspecialchars_decode()的额外好处是它将解码可能在字符串中的任何其他HTML。有关更多信息,请see here