如何通过preg_match_all获取来自同一对象的所有匹配?

时间:2015-12-10 20:41:51

标签: php regex preg-match-all

我有一张桌子:

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

该表可能有<tr>

的任何数量

我有正则表达式:

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

但匹配数组仅包含最后一个匹配。

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

在应用preg_match_all之前,我删除了空格。 这是怎么回事?谢谢!

UPD:有几张桌子的例子

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

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

1 个答案:

答案 0 :(得分:1)

现在通常我首先要说使用正则表达式来偶尔从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