2013-04-30 2 views
2

다음 열의 데이터 형식으로 구성된 데이터베이스 테이블이 있습니다.PHP에서 HTML 테이블 구문 분석

<table cellspacing="1" cellpadding="0" border="0" width="395"> 
    <tbody> 
     <tr> 
      <td valign="top" width="135"> 
       <p>Calories (kcal)<br>Energy (kj)<br>Fats<br>Carbohydrates<br>Protein<br></p> 
      </td> 
      <td valign="top"> 
       <p>178<br>748<br>0 g<br>9.6 g<br>0.1 g<br></p> 
      </td> 
      <td valign="top" width="135"> 
       <p>Fiber<br>Sugars<br>Cholesterol<br>Sodium<br>Alcohol<br></p> 
      </td> 
      <td valign="top"> 
       <p>0 g<br>-<br>0 mg<br>-<br>26.2 g<br></p> 
      </td> 
     </tr> 
    </tbody> 
</table> 

나는 Calories, Fats, CarbohydratesProtein에 대해 별도의 열이 다른 데이터베이스를 만들고 싶어. 이 데이터를 분리하려면 이전 데이터베이스에서 데이터를 가져 와서 이렇게 구문 분석해야합니다.

Calories (kcal)Energy (kj)FatsCarbohydratesProtein 
1787480 g9.6 g0.1 g 

내가 새 데이터베이스에 올바른 열 값을 가지고 출력 문자열을 분리 할 수없는입니다 :

$qry = "SELECT * FROM table"; 
$res = $mysqli->query($qry); 

// new dom object 
$dom = new DOMDocument(); 

while ($row = $res->fetch_assoc()) { 

    $html = @$dom->loadHTML($row['columndata']); 
    //the table by its tag name 
    $tables = $dom->getElementsByTagName('table'); 
    $rows = $tables->item(0)->getElementsByTagName('tr'); 

    foreach ($rows as $row) 
    { 
     $cols = $row->getElementsByTagName('td'); 
     echo $cols->item(0)->nodeValue.'<br />'; 
     echo $cols->item(1)->nodeValue.'<br />'; 
    } 
} 

다음과 같은 출력합니다.

예를 들어, 당신이 당신의 TD 요소의 innerHTML을을 얻고 싶은 경우에, 당신은 건설 다음 사용할 수는 Calories 열에서 Fats 열에서 0 g

+0

'HTML 태그를 기반으로 데이터 분석'이란 무엇을 의미합니까 ?? – Preetam

+0

어떤 출력을 원하십니까? – Waygood

+0

'nodeValue'는 모든 태그를 제거합니다. Javascript의 'innerHTML'과 같은 것이 필요합니다. DOMDocument API에는이 기능이 없으므로 작성해야합니다. http://php.net/manual/en/class.domelement.php에있는 간단한 'get_inner_html' 함수가 있습니다. – Barmar

답변

2

P 요소의 자식 노드를 반복 해보십시오 : br 요소 사이의 텍스트가 하나 개의 텍스트 노드 각각에 있음을 보장하기 위해 p 요소() 정상화를 호출하는 것이 중요하다

foreach ($rows as $row) 
{ 
    $paragraphs = $row->getElementsByTagName('p'); 
    //ensure that all the text between <br> is in one text node 
    $paragraphs->item(0)->normalize(); 
    foreach($paragraphs->item(0)->childNodes as $node) { 
     if ($node->nodeType == XML_TEXT_NODE) { 
      echo $node->nodeValue . '<br/>; 
     } 
    } 

} 

, 예를 들어 <p>Calories (kcal)<br>Energy (kj)<br>...</p>Calories (kcal)Energy (kj)의 텍스트 노드를 가지며, 정규화하지 않고 Cal, ories (, kcal) 등이 아닐 수 있습니다.

+1

감사합니다. @SWilk를 도와주세요. 이 작업을 완료 할 수있었습니다. – Noor

2

을 값 178을 갖고 싶어 :

$tdElement = $row->getElementsByTagName('td')->item(0); 
$tdElement->ownerDocument->saveHTML($tdElement); 

해당 노드의 내부 html을 문자열으로 반환해야합니다.

관련 문제