从cURL结果中提取JSON

djr*_*eed 4 php regex json curl preg-replace

我是regex的新手,我正试图从PHP中的cURL请求中获取JSON响应.

我在考虑使用preg_match_all.

编辑:应该提到curl_exec()的完整响应包括头信息,这就是我需要提取JSON的原因.

HTTP/1.1 401 Unauthorized Server: Apache-Coyote/1.1 WWW-Authenticate:  Digest realm="",  qop="auth", [... etc]
Run Code Online (Sandbox Code Playgroud)

我想要的JSON看起来像这样(跟随所有标题):

{  "requests" :  
  [ { 
     "request_id" : 10298, 
     "name" : "CURL Test2",  
     "submitter" : "First Last",  
     "hide" : false,  
     "priority" : 10,  
     "tags" : [ "label 2" ],  
     "body" : 
          { "type" : "html", "content" : "" },  
     "runs" : 0  
   } ] 
  }
Run Code Online (Sandbox Code Playgroud)

希望只是抓住花括号之间的所有东西.然而,当我这样做时,它会抓住从第一个开口支架到第一个关闭支架的所有东西.为了扩展性,我只想抓住内部的所有内容,包括第一个左大括号和最后一个右大括号.

从技术上讲,它可以从第一个开始大括号开始并返回所有内容直到响应结束(JSON之后没有任何内容).

思考?

ale*_*lex 13

正则表达式很棒,但绝对不是正确的工具.

有一个功能json_decode()可以为您处理这个问题.

它将结构作为对象返回.您可以通过将第二个参数设置为,将其作为数组返回TRUE.即使PHP没有这个功能,你最好还是编写或使用现有的JSON解析器,而不是试图用正则表达式提取部分.

如果您正在使用标题并需要将主体分成单独的变量,那么您应该执行以下操作,其中$chcurl的实例$result是返回的curl_exec().

$headerLen = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
$curlBody = substr($result, $headerLen);`
Run Code Online (Sandbox Code Playgroud)

  • @djreed标题和正文之间应该有一个`\n`,因此注释中的代码应该有效.或者只是将`CURLOPT_HEADER`选项设置为false. (2认同)