我正在尝试在W3C验证器api给出的响应中使用PHP的json_decode函数。我得到的回应是:
{
"url": "http://www.wral.com/weather/page/8106570/?default_map=icontroldoppler",
"messages": [
{
"lastLine": 1151,
"lastColumn": 61,
"message": "Element ul not allowed as child of element button in this context. (Suppressing further errors from this subtree.)",
"messageid": "html5",
"explanation": "\n<div class=\"ve html5\"><dl xmlns=\"http://www.w3.org/1999/xhtml\"><dt>Contexts in which element <a href=\"http://www.w3.org/html/wg/drafts/html/master/single-page.html#the-ul-element\"><code>ul</code></a> may be used:</dt>\n <dd>Where <a href=\"http://www.w3.org/html/wg/drafts/html/master/single-page.html#flow-content-1\">flow content</a> is expected.</dd>\n <dt>Content model for element <a href=\"http://www.w3.org/html/wg/drafts/html/master/single-page.html#the-button-element\"><code>button</code></a>:</dt>\n <dd><a href=\"http://www.w3.org/html/wg/drafts/html/master/single-page.html#phrasing-content-1\">Phrasing content</a>, but there must be no <a href=\"http://www.w3.org/html/wg/drafts/html/master/single-page.html#interactive-content-0\">interactive content</a> descendant.</dd>\n </dl></div>\n",
"type": "error"
}
],
"source": {
"encoding": "utf-8",
"type": "text/html"
}
}
所以我要做的是:
$var = <<<__TEXT__
{
"url": "http://www.wral.com/weather/page/8106570/?default_map=icontroldoppler",
"messages": [
{
"lastLine": 1151,
"lastColumn": 61,
"message": "Element ul not allowed as child of element button in this context. (Suppressing further errors from this subtree.)",
"messageid": "html5",
"explanation": "\n<div class=\"ve html5\"><dl xmlns=\"http://www.w3.org/1999/xhtml\"><dt>Contexts in which element <a href=\"http://www.w3.org/html/wg/drafts/html/master/single-page.html#the-ul-element\"><code>ul</code></a> may be used:</dt>\n <dd>Where <a href=\"http://www.w3.org/html/wg/drafts/html/master/single-page.html#flow-content-1\">flow content</a> is expected.</dd>\n <dt>Content model for element <a href=\"http://www.w3.org/html/wg/drafts/html/master/single-page.html#the-button-element\"><code>button</code></a>:</dt>\n <dd><a href=\"http://www.w3.org/html/wg/drafts/html/master/single-page.html#phrasing-content-1\">Phrasing content</a>, but there must be no <a href=\"http://www.w3.org/html/wg/drafts/html/master/single-page.html#interactive-content-0\">interactive content</a> descendant.</dd>\n </dl></div>\n",
"type": "error"
}
],
"source": {
"encoding": "utf-8",
"type": "text/html"
}
}
__TEXT__;
$decoded = json_decode($var);
返回NULL。我也尝试传入'true'来返回一个关联数组而不是一个对象。
如果我从JSON对象中删除“解释”键,那么它可以正常工作。在运行json_decode之前,我需要对该键中的HTML做些什么吗?
答案 0 :(得分:1)
当我运行您的代码时,json_last_error()会返回JSON_ERROR_SYNTAX
,即使是原始的JSON is valid。如果我将所有内容括在单引号中,则错误消失,因此您的heredoc字符串正在被解析和更改。进一步的分析显示,罪魁祸首是:
"explanation": "\n<div class=\"ve
^^
备选方案:
逃避特殊字符:
"explanation": "\\n<div class=\\"ve
使用string syntax无变量插值:单引号或nowdoc
从文件中读取数据