【问题标题】:Get data only from html table used preg_match_all in php仅从 php 中使用 preg_match_all 的 html 表中获取数据
【发布时间】:2011-05-02 17:40:35
【问题描述】:

我有一个这样的 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>

这是一个数据表,我需要从中获取所有数据。 该表将有很多行 (&lt;tr&gt;&lt;/tr&gt;) 。每行将有一个固定的列 (&lt;td&gt;&lt;/td&gt;)(当前为 5 )。 记住每个 table,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>

【问题讨论】:

标签: php html-table html-parsing preg-match


【解决方案1】:

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 Manualgo through some of my answers to learn more about it's usage.

【讨论】:

    【解决方案2】:

    你绝对不想用 Regex 解析 HTML。

    有太多的变体,其中一个更重要的是,正则表达式不太适合 HTML 的层次结构。最好使用 XML 解析器或更好的 HTML 特定解析器。

    每当我需要抓取 HTML 时,我倾向于使用 Simple HTML DOM Parser 库,它采用 HTML 树并将其解析为可遍历的 PHP 对象,您可以查询类似 JQuery 的东西。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多