O que aconteceu no seu caso foi simplesmente um erro da posição do segundo ?, para que a sua expressão funcione, basta alterar de <(h1|h2|h3).+?>(.)+<?\/\1?>
para <(h1|h2|h3).+?>(.)+?<\/\1?>
Tenho uma outra sugestão também, teste a seguinte expressão no mesmo site (http://regexr.com):
<(h1|h2|h3).*?\1>
Não sei se era a ideia que você queria, mas o trecho acima irá encontrar todas as tags informadas no grupo (h1, h2 e h3) e o seu conteúdo.
Explicando a expressão:
-
<
- Procura pelo caracter em questão; -
(h1|h2|h3)
- Procura pelo grupo de tags; -
.
- Qualquer caracter, exceto quebra de linha; -
*
- Nenhuma ou qualquer quantidade da expressão anterior; -
?
- Expressão preguiçosa (lazy), torna a expressão anterior (*) não-gananciosa (non-greedy), fazendo com que ela encontre o mínimo possível, parando quando encontrar a próxima expressão; -
\1
- Utiliza a expressão do primeiro grupo (nesse caso, (h1|h2|h3)); -
>
- Procura pelo caracter em questão;
Testando o trecho abaixo, vemos que a expressão irá pegar apenas as tags informadas e o seu conteúdo:
<h1 class="logo-topo">teste</h1>class="menu" data-show="false"><ul><li><a href="#box-about-me">About</a></li><li><a href="#box-portfolio">Portfolio</a></li><li><a href="#box-latest-jobs">Work</a></li><li><a href="#box-contact">Contact</a></li></ul></nav><!--/menu--> <span class="menu-mobile"><span></span><span></span><span></span></span><div class="logo"><h1 class="name">fullstack developer</h1>
texto texto texto texto texto texto texto texto texto texto texto texto texto texto
<h3 class="cls">outro teste</h3>texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto