我正在编写一个脚本来处理jsonp响应。这样我就可以解释它,将它发送到客户端,并在ajax中使用我自己的回调。无论如何,服务器的响应是json,如果成功的话。如果请求失败,则返回xml。
我之前检查了一些答案。
Check whether returned file is XML or not
How check if a String is a Valid XML with-out Displaying a Warning in PHP
这个答案很好,我很糟糕。
我写这个。
$xml = simplexml_load_string($result,'SimpleXmlElement', LIBXML_NOERROR+LIBXML_ERR_FATAL+LIBXML_ERR_NONE);
if(!$xml){// json}
这会发出警告,
节点不再存在
警告进入json响应,难以解析。
我知道如果我在php中抑制警告,它会正常工作,但这不是我想要的答案。我想知道,我如何检查字符串格式,而不发出警告。即使在发展中的环境。我认为从根本上解决问题会更好。
然后我用了这个,
$xml = simplexml_load_string($result,'SimpleXmlElement', LIBXML_NOERROR+LIBXML_ERR_FATAL+LIBXML_ERR_NONE);
if($xml == false){ // json }
无论字符串是xml还是json,都会进入块。 $xml == false
始终被评估为真。
我想如果你能向我解释一下,$xml == false
和!$xml
之间的区别就会很大。提前谢谢。
答案 0 :(得分:2)
由于有人要求在不解析XML的情况下检测XML,因此以下正则表达式应匹配有效的XML字符串,至少初步:
^(<([a-zA-Z0-9]+)([\s]+[a-zA-Z0-9]+="[a-zA-Z0-9]+")*>([^<]*([^<]*|(?1))[^<]*)*<\/\2>)$
可在此处测试:http://regex101.com/r/mW9aZ5
但是,我仍然认为libxml
方式更好。 :)
- 编辑1
原来这是一个副本:How check if a String is a Valid XML with-out Displaying a Warning in PHP
Tjirp使用libxml_use_internal_errors(true);
在该线程中的答案效率更高。我建议使用它。
- 我的原始答案,效率低下
编辑: 这需要遍历每个节点调用->isValid()
的XML树中的每个节点。 ->isValid()
仅检查当前节点。正如人们所预料的那样,它不会立即检查整个树。值得注意的是,PHP.net上的文档含糊不清,缺乏完整有用的用法示例。我把它留在了这里,而不是因为这个原因删除它。
您可以使用XMLReader::isValid()
来验证打开的XML文件或字符串是否实际包含有效的XML。
从$result
字符串本身加载:
$xml = new XMLReader();
$xml->xml($result);
$xml->setParserProperty(XMLReader::VALIDATE, true);
$success = true;
while ($xml->read()) {
if (!$xml->isValid()) {
$success = false;
}
}
if ($success) {
// Return valid response
} else {
// Return invalid response
}
或者,您也可以从文件系统上的文件加载XML:
$xml = new XMLReader();
$xml->open($file);
// Rest of code as above
关于if ($xml == false)
始终评估为true,除非$xml
始终为false,否则永远不会发生这种情况。你确定你不是无意中写了if ($xml = false)
而是偶然吗?