У меня есть таблица 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 tag может быть отформатирован (где говорят «…»)
И я надеюсь, что каждый может помочь мне написать регулярное выражение для функции 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>
Вы абсолютно НЕ хотите анализировать HTML с помощью Regex.
Есть слишком много вариаций, для одного, и что более важно, регулярное выражение не очень хорошо разбирается в иерархическом характере 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)
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; }
Настройтесь по своему вкусу. Найдите StackOverflow или ознакомьтесь с руководством по PHP или просмотрите некоторые из моих ответов, чтобы узнать больше о его использовании.