2015-01-11 1 views
0

각 루프의 경우에 TD 내부 TR을 생략하는 방법 HTML 간단한 파서 ...나는이 같은 HTML 콘텐츠를

$html = <<<EOF 
<table id="specialTbl"> 
    <tbody> 
     <tr> 
     <td> row-1-td-1</td> 
     <td> row-1-td-2</td> 
     <td> row-1-td-3</td> 
     <td> 
      <table class="runsOn"> // Problem starts here 
       <tbody> 
        <tr> 
        <td>row-1-td-4-Child-1</td> 
        <td>row-1-td-4-Child-2</td>    
        </tr>    
       </tbody> 
      </table> 
     </td> 
     <td> row-1-td-5</td> 
     <td> row-1-td-6</td> 
     </tr> 
     <tr> 
     <td> row-2-td-1</td> 
     <td> row-2-td-2</td> 
     <td> row-2-td-3</td> 
     <td> 
      <table class="runsOn"> 
       <tbody> 
        <tr> 
        <td>row-2-td-4-Child-1</td> 
        <td>row-2-td-4-Child-2</td>    
        </tr>    
       </tbody> 
      </table> 
     </td> 
     <td> row-2-td-5</td> 
     <td> row-2-td-6</td> 
     </tr> 
     <tr> 
     <td> row-3-td-1</td> 
     <td> row-3-td-2</td> 
     <td> row-3-td-3</td> 
     <td> 
      <table class="runsOn"> 
       <tbody> 
        <tr> 
        <td>row-3-td-4-Child-1</td> 
        <td>row-3-td-4-Child-2</td>    
        </tr>    
       </tbody> 
      </table> 
     </td> 
     <td> row-3-td-5</td> 
     <td> row-3-td-6</td> 
     </tr> 
     <tr> 
     <td> row-4-td-1</td> 
     <td> row-4-td-2</td> 
     <td> row-4-td-3</td> 
     <td> 
      <table class="runsOn"> 
       <tbody> 
        <tr> 
        <td>row-4-td-4-Child-1</td> 
        <td>row-4-td-4-Child-2</td>    
        </tr>    
       </tbody> 
      </table> 
     </td> 
     <td> row-4-td-5</td> 
     <td> row-4-td-6</td> 
     </tr> 
     <tr> 
     <td> row-5-td-1</td> 
     <td> row-5-td-2</td> 
     <td> row-5-td-3</td> 
     <td> 
      <table class="runsOn"> 
       <tbody> 
        <tr> 
        <td>row-5-td-4-Child-1</td> 
        <td>row-5-td-4-Child-2</td>    
        </tr>    
       </tbody> 
      </table> 
     </td> 
     <td> row-5-td-5</td> 
     <td> row-5-td-6</td> 
     </tr> 
     <tr> 
     <td> row-6-td-1</td> 
     <td> row-6-td-2</td> 
     <td> row-6-td-3</td> 
     <td> 
      <table class="runsOn"> 
       <tbody> 
        <tr> 
        <td>row-6-td-4-Child-1</td> 
        <td>row-6-td-4-Child-2</td>    
        </tr>    
       </tbody> 
      </table> 
     </td> 
     <td> row-6-td-5</td> 
     <td> row-6-td-6</td> 
     </tr> 
     <tr> 
     <td> row-7-td-1</td> 
     <td> row-7-td-2</td> 
     <td> row-7-td-3</td> 
     <td> 
      <table class="runsOn"> 
       <tbody> 
        <tr> 
        <td>row-7-td-4-Child-1</td> 
        <td>row-7-td-4-Child-2</td>    
        </tr>    
       </tbody> 
      </table> 
     </td> 
     <td> row-7-td-5</td> 
     <td> row-7-td-6</td> 
     </tr> 
    </tbody> 
</table> 
EOF; 



$html= str_get_html($html); 
$table =$html->find('table#specialTbl',0) ; 
$response["response_code"] = 200; 
$response["rows"] = array(); 
foreach($table->find('tr') as $key=>$value) { 
$post["td1"]= trim(strip_tags($value->find('td',0)->plaintext)); 
$post["td2"]= trim(strip_tags($value->find('td',1)->plaintext)); 
$post["td3"]= trim(strip_tags($value->find('td',2)->plaintext)); 
$post["td4"]= trim(strip_tags($value->find('td',3)->plaintext)); 
$post["td5"]= trim(strip_tags($value->find('td',4)->plaintext)); 
$post["td6"]= trim(strip_tags($value->find('td',5)->plaintext)); 
    array_push($response["rows"], $post); 
} 
$json = json_encode($response); 
echo $json_content; 

그리고 JSON 응답

{ 
"response_code":200, 
"rows":[ 
{ 
"td1":"row-1-td-1", 
"td2":"row-1-td-2", 
"td3":"row-1-td-3", 
"td4":"row-1-td-4-Child-1 row-1-td-4-Child-2", 
"td5":"row-1-td-4-Child-1", 
"td6":"row-1-td-4-Child-2" 
}, 
{ 
"td1":"row-1-td-4-Child-1", 
"td2":"row-1-td-4-Child-2", 
"td3":"", 
"td4":"", 
"td5":"", 
"td6":"" 
}, 
{ 
"td1":"row-2-td-1", 
"td2":"row-2-td-2", 
"td3":"row-2-td-3", 
"td4":"row-2-td-4-Child-1 row-2-td-4-Child-2", 
"td5":"row-2-td-4-Child-1", 
"td6":"row-2-td-4-Child-2" 
}, 
{ 
"td1":"row-2-td-4-Child-1", 
"td2":"row-2-td-4-Child-2", 
"td3":"", 
"td4":"", 
"td5":"", 
"td6":"" 
}, 
{ 
"td1":"row-3-td-1", 
"td2":"row-3-td-2", 
"td3":"row-3-td-3", 
"td4":"row-3-td-4-Child-1 row-3-td-4-Child-2", 
"td5":"row-3-td-4-Child-1", 
"td6":"row-3-td-4-Child-2" 
}, 
{ 
"td1":"row-3-td-4-Child-1", 
"td2":"row-3-td-4-Child-2", 
"td3":"", 
"td4":"", 
"td5":"", 
"td6":"" 
}, 
{ 
"td1":"row-4-td-1", 
"td2":"row-4-td-2", 
"td3":"row-4-td-3", 
"td4":"row-4-td-4-Child-1 row-4-td-4-Child-2", 
"td5":"row-4-td-4-Child-1", 
"td6":"row-4-td-4-Child-2" 
}, 
{ 
"td1":"row-4-td-4-Child-1", 
"td2":"row-4-td-4-Child-2", 
"td3":"", 
"td4":"", 
"td5":"", 
"td6":"" 
}, 
{ 
"td1":"row-5-td-1", 
"td2":"row-5-td-2", 
"td3":"row-5-td-3", 
"td4":"row-5-td-4-Child-1 row-5-td-4-Child-2", 
"td5":"row-5-td-4-Child-1", 
"td6":"row-5-td-4-Child-2" 
}, 
{ 
"td1":"row-5-td-4-Child-1", 
"td2":"row-5-td-4-Child-2", 
"td3":"", 
"td4":"", 
"td5":"", 
"td6":"" 
}, 
{ 
"td1":"row-6-td-1", 
"td2":"row-6-td-2", 
"td3":"row-6-td-3", 
"td4":"row-6-td-4-Child-1 row-6-td-4-Child-2", 
"td5":"row-6-td-4-Child-1", 
"td6":"row-6-td-4-Child-2" 
}, 
{ 
"td1":"row-6-td-4-Child-1", 
"td2":"row-6-td-4-Child-2", 
"td3":"", 
"td4":"", 
"td5":"", 
"td6":"" 
}, 
{ 
"td1":"row-7-td-1", 
"td2":"row-7-td-2", 
"td3":"row-7-td-3", 
"td4":"row-7-td-4-Child-1 row-7-td-4-Child-2", 
"td5":"row-7-td-4-Child-1", 
"td6":"row-7-td-4-Child-2" 
}, 
{ 
"td1":"row-7-td-4-Child-1", 
"td2":"row-7-td-4-Child-2", 
"td3":"", 
"td4":"", 
"td5":"", 
"td6":"" 
} 
] 
} 

문제가 foreach을 함께하다 . 안에있는 tr을 어떻게 건너 뛸 수 있습니까? ID가 "specialTbl"인 테이블에 7 개의 행이 있습니다. 하지만 for each은 runsOn이라는 테이블을 반복하면서 json에서 14 개의 행을 반환합니다.

어떻게 당신은 PHP's DOM parser을 사용할 수

+0

'str_get_html을()'? 어떤 파서를 사용하고 있습니까? –

+0

나는 이것을 사용하고있다. http://simplehtmldom.sourceforge.net/manual.htm –

답변

2

다음과 같이 Xpath와 함께 DomDocument를 사용하는 것이 더 쉬울 것입니다. DomDocument는 이미 PHP5에 있습니다. 그것은 당신에게 원하는 출력을 줄 것이다.

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$xpath = new DOMXpath($doc); 
$response["response_code"] = 200; 
$response["rows"] = array(); 
$trs = $xpath->query("//table[@id='specialTbl']/tbody/tr"); // all child tr's in all child tbody's in any table that has id 'specialTbl' 
foreach ($trs as $tr) { 
    $post = array(); 
    $tds = $xpath->query("td", $tr); // all child td's in $tr 
    foreach ($tds as $key => $td) { 
     $post["td" . ++$key] = $td->textContent; 
    } 
    array_push($response["rows"], $post); 
} 
$json_content = json_encode($response); 
echo $json_content; 

그러나 당신은 또한 http://simplehtmldom.sourceforge.net/manual.htm을 계속 사용하고 CSS와 같은 선택기 사용할 수 있습니다 (테스트되지 않은 코드를, 나는 simplehtmldom이없는) :

기능을 무엇
$html= str_get_html($html); 
$response["response_code"] = 200; 
$response["rows"] = array(); 
$trs = $html->find("table#specialTbl>tbody>tr"); 
foreach ($trs as $tr) { 
    $post = array(); 
    $tds = $tr->children(); 
    foreach ($tds as $key => $td) { 
     $post["td" . ++$key] = $td->innertext; 
    } 
    array_push($response["rows"], $post); 
} 
$json_content = json_encode($response); 
echo $json_content; 
+0

나는 시도하고 업데이 트합니다 .... nl-x 감사합니다 –

+0

@IndraKumarS 나는 $ key =>'을 잊어 버렸기 때문에 방금 나는 내 대답을 편집했습니다. 어쩌면 http : //simplehtmldom.sourceforge.net/manual.htm –

+0

너는 와우받을 자격이있어 .... –

0

(4) TD 내부 테이블을 통해 반복하지 않도록하고, tr 항목을 검색하기 전에, 그것은 HTML 구조에서 모든 중첩 된 테이블 밖으로 치기 얻을 수 있습니다

// Parse the HTML into a DOM object & find the table by ID 
$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$table = $doc->getElementById('specialTbl'); 

// Remove all nested TRs from the DOM table object 
$nested = $table->getElementsByTagName('table'); 
foreach ($nested as $element) 
{ 
    // Remove the TRs from thi nested table 
    foreach ($element->getElementsByTagName('tr') as $tr) 
     $tr->parentNode->removeChild($tr); 
} 

// Now when we search through TRs, we only get the top level ones 
$rows = $table->getElementsByTagName('tr'); 
$response = array(); 
foreach ($rows as $row) 
{ 
    // Collect the values of this row's TDs 
    $tds = array(); 
    foreach ($row->getElementsByTagName('td') as $td) 
    { 
     $tds[] = trim($td->nodeValue); 
    } 

    // Add this row to the response 
    $response['rows'][] = $tds; 
} 

// Add extra response details 
$response['response_code'] = 200; // You shouldn't need to explicitly send this 
$json = json_encode($response); 

// Output JSON 
header('Content-type: application/json'); // Use the correct MIME type 
echo $json; 
+0

이것은 $ Nested = $ table-> getElementsByTagName (') 객체가 아닌 객체에서 getElementsByTagName() 표'); –

+0

도와 주실 수 있습니까 –