2011-12-09 42 views
12

-------------- CHỈNH SỬA ------------------------Bảng HTML thành mảng php

Vì vậy, tôi đang đi với cách tiếp cận DOM. Dưới đây là những gì tôi có cho đến thời điểm này:

<?php function getdata(){ 
    $contents = file_get_contents('internatdata.htm'); 
    //create a DOM based off of the string from the html table 
    $DOM = new DOMDocument; 
    $DOM->loadHTML($contents); 

    //get all tr and td 
    $items = $DOM->getElementsByTagName('tr'); 
    $tds = $DOM->getElementsByTagName('td'); 

    function tdrows($elements){ 
     $str = ""; 
     for ($ii =0; $ii < $elements->length; $ii++){ 
      $str .= $elements->item($ii)->nodeValue . ","; 


      } 
      return $str; 
     } 

    for ($i = 0; $i < $items->length; $i++){ 


     echo tdrows($tds) . "; <br />"; 

     } 

    } 
?> 

Vấn đề tôi đang gặp phải là tôi chỉ muốn chọn td từ mỗi hàng trong bảng. Tôi đang cố gắng để đạt được điều này với một vòng lặp lồng nhau. Thật không may Nó đang in văn bản của mỗi thẻ trên trang bao nhiêu lần như có thẻ. làm thế nào tôi có thể nhận được nó để chỉ in td của mỗi tr và không phải mỗi td trên dom?


Tôi cần sử dụng bảng html làm nguồn dữ liệu của mình vì tôi không có quyền truy cập vào cơ sở dữ liệu. Tôi con số để có thể truy vấn dữ liệu từ bảng html tôi cần tạo ra một chức năng để chuyển đổi bảng thành một mảng, hoặc một mảng đa chiều.

Tôi có ý tưởng cơ bản tôi nghĩ nhưng tôi cần một số trợ giúp hoàn thành mã để trả về một mảng dựa trên bảng html.

Cũng Nếu bạn có một cách tốt hơn để làm điều này không phải là chuyển đổi bảng để một mảng sau đó xin vui lòng cho tôi biết

Đây là ý tưởng tôi đã cho đến nay:

<?php 
function getdata(){ 

    $contents = file_get_contents('data.htm'); 
    //add delimiters (semicolon for a row and comma for a cell) ??? 

    $stripped = strip_tags($contents); 

    //explode into an array based off the delimiters above ??? 


    } 
    ?> 
+4

Cách tốt nhất là nên sử dụng một phân tích cú pháp DOM, ví dụ http://php.net/manual/en/book.dom.php – jli

+1

http: //stackoverflow.com/questions/3627489/php-parse-html-code –

+0

Do 'data.htm' chỉ chứa một bảng và nội dung của nó, hoặc nó là một trang html đầy đủ với nhiều phần tử hơn? Dù sao, mã của bạn vẫn còn thiếu tất cả các phần liên quan đến việc phân tích các phần tử bảng. IMO, tôi sẽ tìm một cách khác: Tôi không thích ý tưởng đọc một bảng html. – jap1968

Trả lời

19

Tôi đã cập nhật chỉnh sửa của bạn để sửa lỗi.

Đối với một bản demo trực tiếp, thấy http://codepad.viper-7.com/Vu5WdK

function tdrows($elements) 
{ 
    $str = ""; 
    foreach ($elements as $element) { 
     $str .= $element->nodeValue . ", "; 
    } 

    return $str; 
} 

function getdata() 
{ 
    $contents = "<table><tr><td>Row 1 Column 1</td><td>Row 1 Column 2</td></tr><tr><td>Row 2 Column 1</td><td>Row 2 Column 2</td></tr></table>"; 
    $DOM = new DOMDocument; 
    $DOM->loadHTML($contents); 

    $items = $DOM->getElementsByTagName('tr'); 

    foreach ($items as $node) { 
     echo tdrows($node->childNodes) . "<br />"; 
    } 
} 

getdata(); 
+0

perfect..thank you – JDV590

+0

Khai báo hàm trong hàm là ý tưởng tồi. Gọi getData(); lần thứ hai sẽ dẫn đến một lỗi nghiêm trọng 'Lỗi nghiêm trọng: Không thể redeclare tdrows()'. –

+0

liên kết bị hỏng .... – T30

1

Một cách để làm cho việc này dễ dàng hơn là sử dụng trình phân tích cú pháp dom http://simplehtmldom.sourceforge.net/.

Bạn vẫn sẽ phải trích xuất thông tin vào một mảng nhưng điều này sẽ giúp dễ dàng lặp qua từng phần tử một.

Các vấn đề liên quan