我想我在PHP5.5.33和5.6.19的XMLReader::readOuterXML
中发现了一个bug .PHP5.2.17很好,没有用7进行测试,我的PHP是VC11 x86线程安全,Apache2.4.18 VC11 Win32。
当读取一个用UTF-8正确编码的XML文件(不管有没有BOM)时,readOuterXML
有时会生成警告"Input is not proper UTF-8, indicate encoding !"
,尽管在违规行之前读取了几个UTF-8编码字符。
删除了一些标记或字符串的同一个文件将顺利通过。
这是用于读取XML文件的函数的简化版本:
function TestXML($file) {
$XR = new XMLReader;
$XR->open($file, null, LIBXML_NOBLANKS);
//Looking for specific node
while (($lastRead = $XR->read()) && ($XR->name !== 'records')) {
;
}
if (!$lastRead) {
echo $file.' : Invalid file or no records';
$XR->close();
return;
}
//Looking for specific node
while (($lastRead = $XR->read()) && ($XR->name !== 'record')) {
;
}
while ($lastRead) {
$xml = $XR->readOuterXML();
if ($xml === '') {
$err = '';
if ($e = libxml_get_last_error()) {
$err = $e->message.' (line: '.$e->line.')';
}
$XR->close();
echo $file.' : Problem with file'.($err ? ' — '.$err : '').'.';
return;
}
//Looking for specific node
while (($lastRead = $XR->next()) && ($XR->name !== 'record')) {
;
}
}
$XR->close();
echo $file.' : Good!';
return;
}
这是我所能产生的最小的XML (没有BOM),它会产生问题:
<?xml version="1.0" encoding="utf-8"?>
<records>
<record><aaa><bbbb><ccc><![CDATA[XXX Xxxxxxxxxxxx]]></ccc><ddd><![CDATA[XXX Xx]]></ddd></bbbb><eee><![CDATA[Xxxxx xxxxxxx: xxxx://xxx.xxx.xx.xx/xxxx?xxxxXx=0xx000x0-000x-0xx0-x000-x0000xx0xx00
Xxxxxxxxxxxx xx Xxxxxxxxxxxx Xxxxxxxxx xx Xxxxxxxxx Xxxxxxxxxxxx Xxxxxxxxxxx Xxxxxxxxxxxx (XXX Xxxxxxxxxxxx), xxxxxxxxx xxxxxxx xx Xxx Xxxxxxxxxx Xxxxxxxxxx Xxx.]]></eee></aaa><fff><bbbb><ggg><![CDATA[Xxxxxxxxx Xxxxxxxxxxxxxxx Xxxxxxxxxx xx Xxxxxxxxxxxx]]></ggg><ccc><![CDATA[XXX Xxxxxxxxxxxx]]></ccc></bbbb><hhh><![CDATA[Xx xxxxx, xx xxxxxxxxxxx XXX Xxxxxxxxxxxx x xxxxxcé x’xxxxxxxx xxx x’Xxxxxxléx léxxxxxxxxx xx xx xxxxxxxx xx xx Xxxxxxxxxx Xxxxxxxxxx Xxx (xxx xxx xx xxxxxxxxxx xxxxxxxxx). Xxxxx xxx xréxxxx xxx xxxxxx xxx déxxxxxxxx XXX Xxxxxxxxxxxx xx xxxx xx’xxxxxxxxxxxx xxxxxxxxxxxxxxx xxxxréxxxxxxtéx xx xxxxxxx xxx XX, xxx XXX xx xxx XXX xx xx xxxxxxxx xx xxxxx x’xxxxxxxx xx xxxxx xx xxxxxxxxx xxxxxxxxxxxxx xxréé (XXX). (Xxxxxxxxéx XXX - Xxx 0000)]]></hhh></fff></record>
</records>
由于问题可以通过添加几个空格(例如,如果上面的内容很漂亮,就不会引起问题)消失,所以我已经上传了用于测试的文件:
坏文件 (无BOM)
坏文件 (从<ggg>
标记的内容中删除了BOM和几个“x”)
良好档案 (与Bad相同,减去<ccc>
标记)。
您还可以从坏文件中删除几个“单词”,它将通过。
那么,这是PHP中的一个bug,还是我只是遗漏了什么呢?
发布于 2016-06-06 11:39:17
为了结束这个问题:正如我的评论中提到的,这是PHP中的一个最近修复的bug。据我所知,受影响的PHP版本为5.5.32、5.5.33、5.5.34、5.5.35、5.6.18、5.6.19、5.6.20和5.6.21。
https://stackoverflow.com/questions/35872301
复制相似问题