我有一张桌子:
<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>
))
答案 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);
}