如何通过 preg_match_all 从相同的对象中获取所有匹配项?

How get all matches from same objects by preg_match_all?

我有一个 table:

<table class="table_class" >
    <tr>
        <td>key</td>
        <td>value</td>
    </tr>
</table>

table 可能有任意计数 <tr>

我有正则表达式:

<table class="table_class">(<tr.*?><td>(.*?)</td><td>(.*?)</td></tr>){1,}</table>

但是匹配数组只包含最后一个匹配项。

只是(<tr.*?><td>(.*?)</td><td>(.*?)</td></tr>)我做不到,因为其他table可能会。

应用前 preg_match_all 我删除了空格。 这是怎么做到的?谢谢!

UPD:示例有几个 tables

<table>
    <tr>
        <td>key</td>
        <td>value</td>
    </tr>
</table>
<table class="table_class" >
    <tr>
        <td>key</td>
        <td>value</td>
    </tr>
</table>

然而,我想知道为什么我的正则表达式只匹配最后 <tr>))

现在通常 我首先要说偶尔使用正则表达式从 HTML 中提取数据很好,因为这样做通常更快更有效比使用真正的解析器。这不是其中一种情况,因为 HTML 的结构非常重要。

而是考虑这样的事情:

$doc = DOMDocument::loadHTML(<<<HTML
<table class="table_class" >
    <tr><td>key1</td><td>value1</td></tr>
    <tr><td>key2</td><td>value2</td></tr>
    <tr><td>key3</td><td>value3</td></tr>
    <tr><td>key4</td><td>value4</td></tr>
</table>
HTML
);
foreach($doc->getElementsByTagName('tr') as $row) { 
  foreach($row->getElementsByTagName('td') as $cell)
    var_dump($cell->nodeValue);
}

See it in action here.