PHP 处理 XML 时产生「空格」的解决办法



PHP 处理某些 XML 字符串时会产生莫名其妙的「空格」。
原因是对于 UTF-8 格式的文件编码,很多编辑器会在文件中写入一个「隐藏」的 BOM 头。对于 BOM, PHP 并不会忽略,在读取、包含或者引用这些文件时,PHP 会把 BOM 作为文件开头正文的一部分,根据嵌入式语言的特点,这串字符将被直接执行出来。这就导致了进行格式转换时会莫名其妙的「空格」,这些「空格」就是这3个不可见的字符。
解决的办法也很简单。通过 urlencode()
方法将返回的 XML 字符串转成 URL 编码后,用空字符串替换掉 %EF%BB%BF
,再用 urldecode()
转回为 XML 字符串就行了。
function saXmlToArray($xml)
{
// 转成urlEncode
$xml = urlencode($xml);
// 替换掉'%EF%BB%BF',这个神奇的BOM
$xml = str_replace('%EF%BB%BF', '', $xml);
// 转回XML字符串
$xml = urldecode($xml);
// 替换掉所有的控制字符
$xml = preg_replace('/[\x00-\x1F]|\x7F/', '', $xml);
// 禁止引用外部XML实体
libxml_disable_entity_loader(true);
// 转成XML
$xmlString = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
// 转数组
$array = json_decode(json_encode($xmlString), true);
// 返回
return $array;
}