Могу ли я переместить таблицу HTML в массив PHP? - PullRequest
1 голос
/ 29 июня 2011

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

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
)

Ответы [ 5 ]

2 голосов
/ 29 июня 2011

Вам лучше с DomDocument loadHTML и DomXPath.Я верю, что это поможет, но это не проверено:

$dom = new DomDocument();
$dom->loadHTML( $your_table );
$xpath = new DOMXPath( $dom );

$arr = array();
foreach ($xpath->query('//td') as $node) {
    $arr[] = $node->nodeValue;
}
1 голос
/ 29 июня 2011

Что вам нужно сделать, это проанализировать этот HTML с помощью синтаксического анализатора DOM вместо регулярного выражения.Это избавит вас от головной боли.

См. Как анализировать и обрабатывать HTML / XML в PHP?

0 голосов
/ 29 июня 2011

Помимо документа DOM, как все предложили, вы можете использовать пользовательские функции, такие как «разнесение», для анализа страниц, если структура страниц останется прежней.

ТАК, допустим, $ html = "HTML COntent";

$tables = explode("<table>", $html);

$table = $tables[1]; //Part after <table>

$table = explode("</table>", $table);
$table = $table[0]; //Part before </table>, so $table contains your table.

, а затем

$rows = explode("<tr>", $table);

// $rows[0] = to be neglected, it contains the part before the first <tr>
// $rows[1] = First TR, so your Heading row
//$rows[1-n] = Your data rows.

так

for ($i=2; $i<count($rows);$i++){
//process each row Here
}
0 голосов
/ 29 июня 2011

Я бы использовал Dom Document для анализа html, а не для регулярных выражений.

0 голосов
/ 29 июня 2011

Вам необходимо использовать некоторые функции DomDocument.

Не используйте регулярные выражения.

...