如何通过 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);
}
我有一个 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);
}