Получить данные только из HTML-таблицы, используемой preg_match_all в PHP - PullRequest
1 голос
/ 30 октября 2010

У меня есть HTML-таблица, подобная этой:

<table ... >

  <tbody ... >

       <tr ... > 
             <td ...>
                  string...
              </td>
                <td ...>
                  string...
              </td>
                <td ...>
                  string...
              </td>
                <td ...>
                  string...
              </td>
                <td ...>
                  string...
              </td>
       </tr>
        <tr ... > 
             <td ...>
                  string...
              </td>
                <td ...>
                  string...
              </td>
                <td ...>
                  string...
              </td>
                <td ...>
             </td>
                <td ...>
                  string...
              </td>
       </tr>
       ..............

  </tbody>


</table>

Это таблица данных, и мне нужно получить все данные из нее.В таблице будет много строк (<tr></tr>).каждая строка будет иметь фиксированные столбцы (<td></td>) (в настоящее время 5).помните каждую таблицу, тег tr, td может быть отформатирован (где, скажем, "...")

И я надеюсь, что каждый может помочь мне написать регулярное выражение для функции preg_match_all, чтобы получить такие данные:

array(
   0 => array(
       0=> 'some data0',
       1=> 'some data1',
       2=> 'some data2',
       3=> 'some data3',
       4=> 'some data4',
   )
   1 => array(
       0=> 'some data0',
       1=> 'some data1',
       2=> 'some data2',
       3=> 'some data3',
       4=> 'some data4',
   )
   2 => array(
       0=> 'some data0',
       1=> 'some data1',
       2=> 'some data2',
       3=> 'some data3',
       4=> 'some data4',
   )
..........
)

Теперь пример для вашего теста, надеюсь, вы поможете мне !!!

<table border="1" >
  <tbody style="" >

       <tr style="" > 
             <td style="color:blue;">
                  data0
              </td>
                <td style="font-size:15px;">
                 data1
              </td>
                <td style="font-size:15px;">
                  data2
              </td>
                <td style="color:blue;">
                  data3
              </td>
                <td style="color:blue;">
                  data4
              </td>
       </tr>
       <tr style="" > 
             <td style="color:blue;">
                  data00
              </td>
                <td style="font-size:15px;">
                 data11
              </td>
                <td style="font-size:15px;">
                  data22
              </td>
                <td style="color:blue;">
                  data33
              </td>
                <td style="color:blue;">
                  data44
              </td>
       </tr>
       <tr style="color:black" > 
             <td style="color:blue;">
                  data000
              </td>
                <td style="font-size:15px;">
                 data111
              </td>
                <td style="font-size:15px;">
                  data222
              </td>
                <td style="color:blue;">
                  data333
              </td>
                <td style="color:blue;">
                  data444
              </td>
       </tr>

  </tbody>


</table>

Ответы [ 2 ]

6 голосов
/ 30 октября 2010

PHP имеет встроенное расширение для анализа HTML и XML с помощью DOM :

$dom = new DOMDocument;
$dom->loadHTML( $htmlContent );
$rows = array();
foreach( $dom->getElementsByTagName( 'tr' ) as $tr ) {
    $cells = array();
    foreach( $tr->getElementsByTagName( 'td' ) as $td ) {
        $cells[] = $td->nodeValue;
    }
    $rows[] = $cells;
}

Настройте по своему вкусу. Search StackOverflow или взгляните на Руководство по PHP или , ознакомьтесь с некоторыми из моих ответов, чтобы узнать больше об их использовании.

5 голосов
/ 30 октября 2010

Вы абсолютно НЕ хотите анализировать HTML с помощью Regex.

Существует слишком много вариантов, с одной стороны, и, что более важно, регулярное выражение не очень хорошо с иерархической природой HTML. Лучше использовать синтаксический анализатор XML или, что еще лучше, - анализатор, специфичный для HTML.

Всякий раз, когда мне нужно почистить HTML, я склонен использовать библиотеку Simple HTML DOM Parser , которая берет дерево HTML и анализирует его в обходном объекте PHP, который можно запросить, например, в JQuery. 1007 *

<?php
    require 'simplehtmldom/simple_html_dom.php';

    $sHtml = <<<EOS
    <table border="1" >
      <tbody style="" >
           <tr style="" > 
                 <td style="color:blue;">
                      data0
                  </td>
                    <td style="font-size:15px;">
                     data1
                  </td>
                    <td style="font-size:15px;">
                      data2
                  </td>
                    <td style="color:blue;">
                      data3
                  </td>
                    <td style="color:blue;">
                      data4
                  </td>
           </tr>
           <tr style="" > 
                 <td style="color:blue;">
                      data00
                  </td>
                    <td style="font-size:15px;">
                     data11
                  </td>
                    <td style="font-size:15px;">
                      data22
                  </td>
                    <td style="color:blue;">
                      data33
                  </td>
                    <td style="color:blue;">
                      data44
                  </td>
           </tr>
           <tr style="color:black" > 
                 <td style="color:blue;">
                      data000
                  </td>
                    <td style="font-size:15px;">
                     data111
                  </td>
                    <td style="font-size:15px;">
                      data222
                  </td>
                    <td style="color:blue;">
                      data333
                  </td>
                    <td style="color:blue;">
                      data444
                  </td>
           </tr>
      </tbody>
    </table>
EOS;

    $oHTML = str_get_html($sHtml);
    $oTRs = $oHTML->find('table tr');
    $aData = array();
    foreach($oTRs as $oTR) {
        $aRow = array();
        $oTDs = $oTR->find('td');

        foreach($oTDs as $oTD) {
            $aRow[] = trim($oTD->plaintext);
        }

        $aData[] = $aRow;
    }

    var_dump($aData);
?>

А на выходе:

array
  0 => 
    array
      0 => string 'data0' (length=5)
      1 => string 'data1' (length=5)
      2 => string 'data2' (length=5)
      3 => string 'data3' (length=5)
      4 => string 'data4' (length=5)
  1 => 
    array
      0 => string 'data00' (length=6)
      1 => string 'data11' (length=6)
      2 => string 'data22' (length=6)
      3 => string 'data33' (length=6)
      4 => string 'data44' (length=6)
  2 => 
    array
      0 => string 'data000' (length=7)
      1 => string 'data111' (length=7)
      2 => string 'data222' (length=7)
      3 => string 'data333' (length=7)
      4 => string 'data444' (length=7)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...