在PHP中使用RegEx选择所有TR HTML标记之间的所有TD

时间:2016-06-16 10:38:50

标签: php regex parsing html-table

我想在以下代码的TR的单独数组中提取所有TD标记

<TR>
<TD class="table_border_both"><B>Person 1</B></TD>
<TD class="table_border_both"><B>Start, 10</B></TD>
<TD class="table_border_both"><B>End  , 5</B></TD>
<TD class="table_border_both"><b>14
</b></TD>
</TR>
<TR>
<TD class="table_border_both"><B>Person 2</B></TD>
<TD class="table_border_both"><B>Start, 10</B></TD>
<TD class="table_border_both"><B>End  , 5</B></TD>
<TD class="table_border_both"><b>14
</b></TD>

我试过这个RegEx如下

preg_match_all("/([<tr>|\\n]+(<td class=\"table_border_both\"><b>(.*?)<\\/b><\\/td>))/is", $str, $matches);

但是我希望所有TR都在saprate数组中,如下所示

[0]=>
array(4) {
[0]=>string(12) "Person 1"
[1]=>string(19) "Start, 10"
[2]=>string(12) "End  , 5"
[3]=>string(7) "14
}
[1]=>
array(4) {
[0]=>string(12) "Person 2"
[1]=>string(19) "Start, 10"
[2]=>string(12) "End  , 5"
[3]=>string(7) "14
}

2 个答案:

答案 0 :(得分:0)

don't attempt to parse HTML with regular expressions。它不适合这项工作。

为此目的,PHP有一个DOM extension。然后,您可以使用简单的XPath查询来提取所需的元素。

甚至还有一些库使这更容易(列表并不详尽):

答案 1 :(得分:0)

我 - 像你一样 - 用RegExes做些讨厌的事情。但是现在我不确定你是否认真使用正则表达而不是开玩笑,或者只是开玩笑,但作为社区预言的一部分,我想向你介绍{{ 1}}及其兄弟DOMDocument

DOMXPath

<强>输出

$document = new DOMDocument;
$document->loadHTML($html);
$xpath = new DOMXPath($document);
$trs = $xpath->query('//tr');
$array = [];
foreach ($trs as $key => $tr) {
    $td = $xpath->query('td', $tr);
    foreach ($td as $value) {
        $array[$key][] = $value->nodeValue;
    }
}
print_r($array);

Array ( [0] => Array ( [0] => Person 1 [1] => Start, 10 [2] => End , 5 [3] => 14 ) [1] => Array ( [0] => Person 2 [1] => Start, 10 [2] => End , 5 [3] => 14 ) ) 是您的HTML源代码