简体   繁体   English

仅从php中使用的preg_match_all的html表中获取数据

[英]Get data only from html table used preg_match_all in php

I have a html table like this : 我有这样的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>

This is a data table and I need to get all data from this. 这是一个数据表,我需要从中获取所有数据。 The table will have many rows ( <tr></tr> ) . 该表将有很多行( <tr></tr> )。 each row will have a fixed columns ( <td></td> )(currently is 5 ). 每行将有一个固定的列( <td></td> )(当前为5)。 remember each table,tr,td tag maybe formatted (where say "...") 记住每个表,tr,td标签可能被格式化(在其中说“ ...”)

And I hope everyone can help me to write a regex for preg_match_all function to get the data like this : 我希望每个人都可以帮助我为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',
   )
..........
)

Now the example for your test, hopfully you can help me!!! 现在为您的测试示例,希望您能帮助我!

<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 has a native extension to parse HTML and XML with DOM : PHP具有本机扩展,可以使用DOM解析HTML和XML:

$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;
}

Adjust to your liking. 根据自己的喜好进行调整。 Search StackOverflow or have a look at the PHP Manual or go through some of my answers to learn more about it's usage. 搜索StackOverflow或查看PHP手册,浏览我的一些答案以了解有关其用法的更多信息。

You absolutely do NOT want to parse HTML with Regex. 您绝对不希望使用Regex解析HTML。

There are far too many variations, for one, and more importantly, regex isn't very good with the hierarchal nature of HTML. 有太多的变化,其中之一是更重要的,更重要的是,正则表达式在HTML的层次结构特性方面不是很好。 It's best to use an XML parser or better-yet an HTML-specific parser. 最好使用XML解析器,或者最好使用特定于HTML的解析器。

Whenever I need to scrape HTML, I tend to use the Simple HTML DOM Parser library, which takes an HTML tree and parses it into a traversable PHP object, which you can query something like JQuery. 每当需要刮擦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);
?>

And the output: 并输出:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM