1.匹配重复标签和嵌套标签 

(1).匹配重复标签

//重复标签
$string = "<tr width='100'>1</tr><tr width='98'>2</tr>";

//贪婪模式
preg_match_all('#<tr[^>]*>.*</tr>#is', $string, $matches);

print_r($matches);

//非贪婪模式
//这里.*?中的?表示与默认的模式相反,如果默认配置是贪婪,这里就是非贪婪模式 
//如果默认配置是非贪婪,这里就是贪婪模式(我们取默认配置是贪婪,请注意和其他地方?的意义区别) 
preg_match_all('#<tr[^>]*>.*?</tr>#is', $string, $matches); 
print_r($matches);

(2).匹配单个标签

//嵌套标签 
$string = "<table width='300'>1<table width='150'>2</table></table>"; 

//贪婪模式 

preg_match_all('#<table[^>]*>.*</table>#is', $string, $matches);

print_r($matches);

//非贪婪模式 

preg_match_all('#<table[^>]*>.*?</table>#is', $string, $matches);

print_r($matches);

2.匹配层层嵌套标签

$text = 'foo <div class="t1">Content <div>more stuff</div></div> bar <div>even more</div>baz 
     <div class="t2">yes <div>aaa<div>bbb<div>ccc</div>bbb</div>aaa</div> </div>';
if(preg_match_all('#<div\s+class="t\d+">[^<>]*(<div[^>]*>(?:[^<>]*|(?1))*</div>)[^<>]*</div>#si', $text, $matches)) {
    print_r($matches[0]);
}

输出:
Array
(
    [0] => <div class="t1">Content <div>more stuff</div></div>
    [1] => <div class="t2">yes <div>aaa<div>bbb<div>ccc</div>bbb</div>aaa</div> </div>
)


表达式 (?:exp) 的意思是:匹配exp,不捕获匹配的文本,也不给此分组分配组号

其他问号?用法:https://blog.csdn.net/handsomexiaominge/article/details/87886857

其他^的用法:https://blog.csdn.net/doubleguy/article/details/90341705

3.匹配混合嵌套标签