3v4l.org

run code in 300+ PHP versions simultaneously
<?php $headers = <<<'HTML' <html> <h5>5 Header 0.0.0.0.1</h5> <h1>1 Header 1</h1> <h2>2 Header 1.1</h2> <h2>2 Header 1.2</h2> <h3>3 Header 1.2.1</h3> <h4>4 Header 1.2.2</h4> <h2>2 Header 1.3</h2> <h3>3 Header 1.3.1</h3> <h3>3 Header 1.3.2</h3> <h5>5 Header 1.3.2.1.1</h5> <h6>6 Header 1.3.2.1.1.1</h6> <h1>1 Header 2</h1> <h2>2 Header 2.1</h2> </html> HTML; $doc = new DomDocument(); $doc->loadHTML($headers); $xpath = new DOMXPath($doc); $otag = '<ul>'; $ctag = '</ul>'; $query = '//*[self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or self::h6]'; $previousLevel = 1; $out[] = $otag; foreach ($xpath->query($query) as $headerElement) { $level = (int) $headerElement->nodeName[1]; if ($level < 1 || $level > 6) { $level = 1; continue; } if ($level > $previousLevel) { $out[] = str_repeat($otag, $level - $previousLevel); } elseif ($level < $previousLevel) { $out[] = str_repeat($ctag, $previousLevel - $level); } $out[] = '<li>' . $headerElement->textContent . '</li>'; $previousLevel = $level; } $out[] = str_repeat($ctag, $level); echo implode(PHP_EOL, $out);
Output for 8.1.23 - 8.1.28, 8.2.5 - 8.2.18, 8.3.0 - 8.3.6
<ul> <ul><ul><ul><ul> <li>5 Header 0.0.0.0.1</li> </ul></ul></ul></ul> <li>1 Header 1</li> <ul> <li>2 Header 1.1</li> <li>2 Header 1.2</li> <ul> <li>3 Header 1.2.1</li> <ul> <li>4 Header 1.2.2</li> </ul></ul> <li>2 Header 1.3</li> <ul> <li>3 Header 1.3.1</li> <li>3 Header 1.3.2</li> <ul><ul> <li>5 Header 1.3.2.1.1</li> <ul> <li>6 Header 1.3.2.1.1.1</li> </ul></ul></ul></ul></ul> <li>1 Header 2</li> <ul> <li>2 Header 2.1</li> </ul></ul>

preferences:
68.61 ms | 403 KiB | 28 Q