2013-04-30 3 views
2

У меня есть таблица базы данных, которая состоит из следующего формата данных в одном столбце.Анализ таблицы HTML в php

<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, Carbohydrates и Protein. Чтобы отделить эти данные, мне нужно получить данные из старой базы данных и проанализировать их так.

$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 />'; 
    } 
} 

Это выводит следующее:

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

Я не могу отделить строки вывода, чтобы иметь правильные значения столбцов в новой базе данных.

Например, я хочу иметь значение 178 в Calories колонке, 0 g в Fats колонке и т.д.

+0

Что вы подразумеваете под «анализом данных на основе тега HTML» ?? – Preetam

+0

Какой выход вы хотите? – Waygood

+0

'nodeValue' удаляет все теги, вы хотите что-то вроде' innerHTML' Javascript. API DOMDocument этого не имеет, вам нужно написать его. В комментариях есть простая функция 'get_inner_html': http://php.net/manual/en/class.domelement.php – Barmar

ответ

2

Постарайтесь итерацией дочерних узлов 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/>; 
     } 
    } 

} 

Важно вызвать Normalize() на p элемента, чтобы гарантировать, что тексты между br элементами в одном текстовом узле каждого, и не разделены, например, <p>Calories (kcal)<br>Energy (kj)<br>...</p> будут иметь текстовые узлы Calories (kcal) и Energy (kj), а не Cal, ories (, kcal) и т. д., которые могут быть без нормализации.

+1

Спасибо @SWilk с вашей помощью I смог завершить это. – Noor

2

Если вы хотите получить innerHTML вашего тд элемента, вы можете использовать следующие конструкции:

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

Он должен вернуть вам внутренний HTML этого узла в качестве строки.