你如何使string“XML安全”?
我正在通过PHP回应发送一个XML文档来响应AJAX调用。 为了形成这个XML文档,我循环了一个数据库的logging。 问题在于数据库包含其中包含“<”符号的logging。 所以很自然,浏览器会在这个特定的地方抛出一个错误。 这怎么解决?
通过使用htmlspecialchars转义这些字符,或者更恰当地说,使用一个用于构buildXML文档的库(如DOMDocument或XMLWriter) 。 
 另一种方法是使用CDATA部分,但是你必须注意出现]]> 。 
还要考虑到您必须遵守您为XML文档定义的编码(默认为UTF-8)。
从PHP 5.4开始,你可以使用:
 htmlspecialchars($string, ENT_XML1); 
您应该指定编码,例如:
 htmlspecialchars($string, ENT_XML1, 'UTF-8'); 
更新
请注意,以上只会转换:
-   &to&
-   <至<
-   >到>
如果您想转义文本以用于用双引号括起来的属性:
 htmlspecialchars($string, ENT_XML1 | ENT_COMPAT, 'UTF-8'); 
 除了& , <和>之外,还会将其转换为" 。 
如果你的属性用单引号括起来:
 htmlspecialchars($string, ENT_XML1 | ENT_QUOTES, 'UTF-8'); 
 将“转换'为' 除了& , < , >和" 。 
(当然你甚至可以在属性之外使用它)。
请参阅htmlspecialchars的手册条目 。
1)你可以像下面这样把你的文本打包成CDATA:
 <mytag> <![CDATA[Your text goes here. Btw: 5<6 and 6>5]]> </mytag> 
见http://www.w3schools.com/xml/xml_cdata.asp
2)正如有人所说:逃避这些字符。 例如像这样:
 5<6 and 6>5 
如果可能的话,使用XML类而不是string处理来创buildXML总是一个好主意 – 其中一个好处就是类会根据需要自动转义字符。
尝试这个:
 $str = htmlentities($str,ENT_QUOTES,'UTF-8'); 
 因此,在使用htmlentities()函数过滤数据之后,可以使用XML标记中的数据,如: 
 <mytag>$str</mytag> 
添加这个以防万一有用。
由于我正在使用日文字符,编码也已被适当设置。 但是,我不时发现,特性和特性是不够的。
某些用户input包含上述function没有剥离的特殊字符。 在这些情况下,我必须这样做:
 preg_replace('/[\x00-\x1f]/','',htmlspecialchars($string)) 
 这也将删除某些xml-unsafe控制字符,如Null character或EOT 。 您可以使用此表来确定您希望忽略哪些字符。