У меня есть скрипт, который скручивает веб-страницу и вытаскивает таблицу. Я дошел до того, что
echo "<table>";
echo $table;
echo "</table>;
выведет таблицу, которую я ищу, но мне нужно, чтобы она была в массиве, чтобы я мог просматривать каждую строку отдельно. Первая строка таблицы имеет имена столбцов, если это облегчает задачу. Ниже приведен формат таблицы:
<code><pre>
<table>
<tbody id="sortable1">
<tr id="skip_coloring" class="nosort">
<tr>
<td class="border_even" style="white-space:nowrap">06/20/2011 4:33 PM </td>
<td class="border_even">
<strong>user_name, ext</strong>
</td>
<td class="border_even"> outside_num </td>
<td class="border_even"> outgoing </td>
<td class="border_even"> 12m, 14s </td>
<td class="border_even"> 12m, 5s </td>
<tr>
<tr>
</tbody>
</table>
id=skip_coloring
имеет имена столбцов. Все остальные строки являются данными. Я использую preg_match, чтобы получить таблицу; если есть лучший способ сделать это, дайте мне знать. Прямо сейчас я использую следующую preg_match
, чтобы получить эту таблицу:
preg_match('#<table[^>]*id="row1"[^>]*>(.+?)<\\/table>#is', $cres_data, $matches);
, но $matches
- это массив с 2 индексами, по одному на каждую страницу результатов, которые создает таблица. Может быть, было бы лучше попробовать сопоставить каждую строку в таблице? Кажется, я вспоминаю, что это можно сделать с помощью simplexml или чего-то еще, но я еще не получил этого. Любая помощь приветствуется.
редактировать
Завершено использованием DOM; вот что у меня сейчас:
$dom = new DomDocument();
$dom->loadHTML($cres_data);
$xpath = new DOMXPath($dom);
//get the first row of values
$arr = array();
foreach ($xpath->query('//tbody[@id="sortable1"]/tr/td') as $node)
{
$arr[] = $node->nodeValue;
}
echo '<pre>';
print_($arr);
Вывод, однако, не совсем правильный:
Array
(
[0] =>
Call Date
[1] =>
Call From
.
.
.
[7] =>
06/20/2011 4:33 PM
[8] =>
user_name <ext>
Есть ли какой-нибудь способ удалить все пробелы и получить имена столбцов в качестве меток индекса? Я предполагаю, что мне нужно будет сделать это дважды или добавить дополнительный foreach ... он всегда будет форматироваться одинаково, если это имеет значение.
редактировать
Используйте эту функцию как для меток, так и для данных, чтобы правильно отформатировать ее:
$label_arr = array_filter(array_map('trim',$label_arr));
Вывод был именно то, что мне нужно.
Array
(
[Call Date] => 06/20/2011 4:33 PM
[Call From] => user_name <ext>
[Call To] => outside_num
[Call Type] => outgoing
[Call Time] => 12m, 14s
[Talk Time] => 12m, 5s
)