PHP DOM / XPath

Надеюсь, это будет простой вопрос для тех, кто сделал это раньше!

У меня есть список старых веб-документов в формате таблицы с большим количеством контактной информации. До сих пор мне удалось создать скрипт 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>'; ?> 

Любая помощь будет замечательной!

благодаря

Я полагал, что вы ищете что-то вроде этого:

 $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 ) 

Я смотрел именно на это и отлично работал.

Я создал функцию для извлечения и сохранения в 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. 

Благодарю.