Dazu müssen Sie nur nach den Tags im HTML-Code suchen.
Ich habe zwei Funktionen geschrieben (PHP 5.4.x).
Die erste gibt ein Array zurück, das die Daten des Inhaltsverzeichnisses enthält. Die Daten sind nur die Überschrift selbst, die ID des Tags (wenn Sie Anker verwenden möchten) und eine Untertabelle des Inhalts.
function get_headlines($html, $depth = 1)
{
if($depth > 7)
return [];
$headlines = explode('<h' . $depth, $html);
unset($headlines[0]); // contains only text before the first headline
if(count($headlines) == 0)
return [];
$toc = []; // will contain the (sub-) toc
foreach($headlines as $headline)
{
list($hl_info, $temp) = explode('>', $headline, 2);
// $hl_info contains attributes of <hi ... > like the id.
list($hl_text, $sub_content) = explode('</h' . $depth . '>', $temp, 2);
// $hl contains the headline
// $sub_content contains maybe other <hi>-tags
$id = '';
if(strlen($hl_info) > 0 && ($id_tag_pos = stripos($hl_info,'id')) !== false)
{
$id_start_pos = stripos($hl_info, '"', $id_tag_pos);
$id_end_pos = stripos($hl_info, '"', $id_start_pos);
$id = substr($hl_info, $id_start_pos, $id_end_pos-$id_start_pos);
}
$toc[] = [ 'id' => $id,
'text' => $hl_text,
'sub_toc' => get_headlines($sub_content, $depth + 1)
];
}
return $toc;
}
Die zweite gibt eine Zeichenkette zurück, die das Toc mit HTML formatiert.
function print_toc($toc, $link_to_htmlpage = '', $depth = 1)
{
if(count($toc) == 0)
return '';
$toc_str = '';
if($depth == 1)
$toc_str .= '<h1>Table of Content</h1>';
foreach($toc as $headline)
{
$toc_str .= '<p class="headline' . $depth . '">';
if($headline['id'] != '')
$toc_str .= '<a href="' . $link_to_htmlpage . '#' . $headline['id'] . '">';
$toc_str .= $headline['text'];
$toc_str .= ($headline['id'] != '') ? '</a>' : '';
$toc_str .= '</p>';
$toc_str .= print_toc($headline['sub_toc'], $link_to_htmlpage, $depth+1);
}
return $toc_str;
}
Beide Funktionen sind weit davon entfernt, perfekt zu sein, aber in meinen Tests haben sie gut funktioniert. Sie können sie gerne verbessern.
Hinweis: get_headlines
ist kein Parser, d.h. er funktioniert nicht bei kaputtem HTML-Code und stürzt einfach ab. Es funktioniert auch nur mit Kleinbuchstaben <hi>
-tags.