使用PHP从W3C Validator获取json_decode响应

时间:2014-02-17 16:47:46

标签: php validation json w3c

我正在尝试在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做些什么吗?

1 个答案:

答案 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

  • 从文件中读取数据