<?php $html = <<<'HTML' <p>Lorem ipsum dolor sit amet...</p> <p>consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat</p> <img src="/path/to/image.jpg" /> <h2 class="style" id="name">first headline 2</h2> <p>Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat</p> <p>Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat</p> <h3 class="style" id="name1">Headline 3</h3> <p>vel illum dolore eu feugiat nulla facilisis at vero et accumsan et iusto odio dignissim qui</p> <h3 class="style" id="name2">On more Headline 3</h3> <p>blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi</p> <h2 id="name3" class="style">Headline 2 with class</h2> <p>Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet</p> <H2 id="name4">Another Headline 2 without class</h2> <p>doming id quod mazim placerat facer possim assum</p> HTML; libxml_use_internal_errors(true); $dom = new DOMDocument; $dom->loadHTML($html); $xp = new DOMXPath($dom); $query = '//*[contains("h1 h2 h3 h4 h5 h6", name())]'; $nodes = $xp->query($query); $currentLevel = ['level' => 0, 'count' => 0]; $stack = []; $format = '<li><a href="#%s">%s</a></li>'; $result = ''; foreach($nodes as $node) { $level = (int)$node->tagName[1]; // extract the digit after h while($level < $currentLevel['level']) { $currentLevel = array_pop($stack); $result .= '</ul>'; } if ($level === $currentLevel['level']) { $currentLevel['count']++; } else { $stack[] = $currentLevel; $currentLevel = ['level' => $level, 'count' => 1]; $result .= '<ul>'; } $result .= sprintf($format, $node->getAttribute('id'), $node->nodeValue); } $result .= str_repeat('</ul>', count($stack)); echo $result;
You have javascript disabled. You will not be able to edit any code.