2016-06-10 8 views
1

cURL을 사용하여 웹 페이지로 이동합니다. cURL을 스크립트의 응답으로, 나는 본질적으로html 문자열에서 JSON 데이터로드

$dom = new DOMDocument(); 
$dom->loadHTML($response); 

다음을 수행하면 나는 내가 그 페이지의 HTML 코드를 모두 볼 수 있습니다 예상대로 출력 $dom. 코드 내에서 다음과 같은 특정 섹션이 있습니다.

<script id="data" type="application/json"> 
<![CDATA[ 
{ 
    sortColumn: "QuoteNumber", 
    quotes: { 
     "Data": 
     [ 
      { 
       "ID":3235720, 
       "Date":"20 May 2016", 
       "QuoteNumber":"Q12415", 
       "Name":"Some Name", 
       "Client":"Some Client", 
       "StateName":"Issued", 
       "Url":"/Quote/View/3235720" 
      } 
     ] 
    } 
} 
]]> 
</script> 

이 특정 코드 블록 만 타겟팅 할 수있는 방법이 있습니까? 본질적으로 JSON을로드하고 견적 ID를 가져와야합니다. 이것이 가능한가?

+2

. 질문에 정확하게 복사 했습니까? 세 개의 여는 중괄호와 한 개의 닫는 중괄호가 있습니다. 또한 일부 속성 (예 :'sortColumn')은 따옴표로 묶지 않으며 JSON에서는 유효하지 않습니다. – trincot

+0

안녕하세요, 감사합니다. JSON 데이터가 많았고 많은 데이터가 삭제되었으므로 문제가 간단합니다. 나는 중괄호를 놓친 것 같습니다. 감사 –

답변

2
  1. 당신은 getElementById("data")
  2. 상수 XML_CDATA_SECTION_NODE과 비교하여 CDATA 노드를 확인하여 <script> 태그를 얻을 수 있습니다.
  3. CDATA 태그를 제거하려면 str_replace()을 사용하십시오.
  4. 콘텐츠를 JSON으로 구문 분석하려면 json_decode을 사용하십시오.

그런데 CDATA 내의 콘텐츠는 실제로 형식이 잘못된 JSON입니다. 아래에 설명 된대로 그것은 수정해야합니다 : 당신은 몇 가지 오류 메시지를 볼 수 있도록

<![CDATA[ 
{ 
    "sortColumn" : "QuoteNumber", 
    "quotes": { 
     "Data": 
     [ 
      { 
       "ID":3235720, 
       "Date":"20 May 2016", 
       "QuoteNumber":"Q12415", 
       "Name":"Some Name", 
       "Client":"Some Client", 
       "StateName":"Issued", 
       "Url":"/Quote/View/3235720" 
      } 
     ] 
    } 
} 
]]> 

은 또한 하단에 has_json_error() 기능을 추가했습니다.

$dom = new DOMDocument(); 
$dom->loadHTML($response); 
$data = $dom->getElementById("data"); 
$content = ''; 
foreach ($data->childNodes as $child) { 
    if ($child->nodeType == XML_CDATA_SECTION_NODE) { 
     $content = $child->textContent; 
    } 
} 
$content = str_replace(array("<![CDATA[", "]]>"), '', $content); 
$jsons = json_decode($content); 

if(!has_json_error()) { 
    echo $jsons->sortColumn; 
    echo "<br /><br />"; 
    print_r($jsons->quotes); 
    echo "<br /><br />"; 
    $data = $jsons->quotes->Data; 
    foreach($data as $obj) { 
     echo $obj->ID . "<br />"; 
     echo $obj->Date . "<br />"; 
     echo $obj->QuoteNumber . "<br />"; 
     echo $obj->Name . "<br />"; 
     echo $obj->Client . "<br />"; 
     echo $obj->StateName . "<br />"; 
     echo $obj->Url . "<br />"; 
    } 
} 

function has_json_error() { 
    if (function_exists ('json_last_error') && json_last_error() !== JSON_ERROR_NONE) { 
     switch (json_last_error()) { 
      case JSON_ERROR_DEPTH: 
       echo 'JSON_ERROR: - Maximum stack depth exceeded'; 
      break; 
      case JSON_ERROR_STATE_MISMATCH: 
       echo 'JSON_ERROR: - Underflow or the modes mismatch'; 
      break; 
      case JSON_ERROR_CTRL_CHAR: 
       echo 'JSON_ERROR: - Unexpected control character found'; 
      break; 
      case JSON_ERROR_SYNTAX: 
       echo 'JSON_ERROR: - Syntax error, malformed JSON'; 
      break; 
      case JSON_ERROR_UTF8: 
       echo 'JSON_ERROR: - Malformed UTF-8 characters, possibly incorrectly encoded'; 
      break; 
      default: 
       echo 'JSON_ERROR: - Unknown error: ' . json_last_error(); 
      break; 
     }   
     return true; 
    } 
    else if (function_exists ('json_last_error_msg') && json_last_error_msg() !== "No error") { 
     echo ("json_last_error_msg, JSON_ERROR:" . json_last_error_msg()); 
     return true; 
    } 
    return false; 
} 

위의 예제 코드의 결과는 다음과 같은 것을 할 것입니다 : JSON의 조각이 무효라고

QuoteNumber 

stdClass Object ( 
    [Data] => Array ( 
     [0] => stdClass Object ( 
      [ID] => 3235720 
      [Date] => 20 May 2016 
      [QuoteNumber] => Q12415 
      [Name] => Some Name 
      [Client] => Some Client 
      [StateName] => Issued 
      [Url] => /Quote/View/3235720 
     ) 
    ) 
) 

3235720 
20 May 2016 
Q12415 
Some Name 
Some Client 
Issued 
/Quote/View/3235720