Das machst Du bei PHP am besten mittels XPath aus der DOM-Klassensammlung.
Wenn ich damit einigermaßen durch bin, kann ich Dir gerne weiterhelfen.
Ich hab für Dich schon mal angefangen:
<?php
$html='<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
</head>
<body>
<h1>Hallo Welt!</h1>
<p>Lorem ipsum
<h2>Jaja</h2>
<p>Lorem ipsum
<p>Lorem ipsum
<h2>Soso</h2>
<p>Lorem ipsum
<p>Lorem ipsum
</body>
</html>';
$doc = new DOMDocument();
$doc -> loadHTML( $html );
foreach ( $doc -> getElementsByTagName( '*' ) as $node ) {
$path = $node -> getNodePath();
$ar = array_reverse( explode( '/', $path ) );
$tagName = array_shift( $ar );
if ( preg_match( '/[Hh][1-6]/', $tagName ) ) {
echo $node -> textContent . "\n";
}
}