2011-03-30 43 views
1

希望對於以前做過的人來說,這應該是一個簡單的問題!PHP DOM/XPath

我有一個表格式的舊web文檔列表,裏面有很多聯繫方式。到目前爲止,我管理的是創建一個PHP腳本,用於解析XHTML文檔並提取舊客戶端聯繫人詳細信息。

文檔格式的例子:

<tr> 
    <td bgcolor="#CCCCCC" valign="top"><a href="#" class="details">Indigo Blue 123</a></td> 
    <td bgcolor="#CCCCCC"></td> 
    <td bgcolor="#CCCCCC" align="top"><font class="details">123 Blue House</font></td> 
    <td bgcolor="#CCCCCC"></td> 
    <td bgcolor="#CCCCCC" valign="top"></td> 
    <td bgcolor="#CCCCCC"></td> 
    <td bgcolor="#CCCCCC" align="top"></td> 
    <td bgcolor="#CCCCCC"></td> 
    <td bgcolor="#CCCCCC" valign="top"><font class="details">Hanley</font></td> 
    <td bgcolor="#CCCCCC"></td> 
    <td bgcolor="#CCCCCC" valign="top"></td> 
    <td bgcolor="#CCCCCC"></td> 
    <td bgcolor="#CCCCCC" valign="top"><font class="details">ST13 4SN</font></td> 
    <td bgcolor="#CCCCCC"></td> 
    <td bgcolor="#CCCCCC" valign="top"><font class="details">Stoke on Trent</font></td> 
    <td bgcolor="#CCCCCC"></td> 
    <td bgcolor="#CCCCCC" valign="top"><font class="details">01875 322511</font></td> 
    <td bgcolor="#CCCCCC"></td> 
    <td bgcolor="#CCCCCC" valign="top"></td> 
    <td bgcolor="#CCCCCC"></td> 
    <td bgcolor="#CCCCCC" valign="top"><a href="http://www.indigoblue123.org.uk" target="_blank" class="details">www.indigoblue123.org.uk</a></td> 
    <td bgcolor="#CCCCCC"></td> 
</tr> 

我需要做的是分析所有這些聯繫方式到一個數組。我不確定如何完成的一些事情是將空塊取爲空數組條目(即地址2和地址3將爲空,但我需要知道這一點)以及從<a>..</a>中獲取網址塊。

到目前爲止,我已經計算出所有填充的數據都以某種形式存在class=details。但是,正如我之前提到的,我不確定完成整體結果的最佳方式是什麼。在我有不同的文件大約20-40條目。

我迄今所管理的基礎知識,這樣的:

<?php 
    print '<pre>'; 
    $html = file_get_contents('old-contacts.xhtml'); 

    // Create new DOM object: 
    $dom = new DomDocument(); 

    // Load HTML code: 
    $dom->loadHTML($html); 

    $xpath = new DOMXPath($dom); 
    $details = $xpath->query("//table/tbody/tr[td/font/@class = 'details']"); 

    for ($i = 0; $i < $details->length; $i++) { 
    $data[$i]['data'] = $details->item($i)->nodeValue; 
    echo $data[$i]['data']; 
    } 
    print '</pre>'; 
?> 

任何幫助將是巨大的!

感謝

回答

8

我相信你正在尋找的東西是這樣的:

$nodes = $xpath->query('//table/tbody/tr/td[@align="top"] | 
         //table/tbody/tr/td[@valign="top"]'); 

$data = array(); 
foreach ($nodes as $node) { 
    $data[] = $node->textContent; 
} 

這將使你:

Array 
(
    [0] => Indigo Blue 123 
    [1] => 123 Blue House 
    [2] => 
    [3] => 
    [4] => Hanley 
    [5] => 
    [6] => ST13 4SN 
    [7] => Stoke on Trent 
    [8] => 01875 322511 
    [9] => 
    [10] => www.indigoblue123.org.uk 
) 
1

我一直在尋找正是它,並努力完善。

我創建了一個函數來提取並保存爲HTML

function clean_web_source($web_source) { 
     $dom = new DOMDocument(); 
     @$dom->loadHTML($web_source); 
     $xpath = new DOMXPath($dom); 
     $nodes = $xpath->query('//table[@width="580"]'); 
     $data = array(); 
     foreach ($nodes as $node) { 
      $tmp_dom = new DOMDocument(); 
      $tmp_dom->appendChild($tmp_dom->importNode($node, true)); 
      $data[] = trim($tmp_dom->saveHTML()); //Before use "saveHTML" I used textContent and print_r($data) to identify the array position that interested me. 
     } 
     return $data[2]; //The code in position 2 it's what I want. 
    } 

    $url = "http://www.theurl.com/?param=1&lang=1"; 
$web_source = file_get_contents($url); 
$target_source = clean_web_source($web_source); //What I've look for. 

感謝。