Regina Schaukrug: HTML Überschriften Pharsen und Inhaltsverzeichnis erstellen

Beitrag lesen

Du kannst auch gleich mit preg_replace() ersetzen. Dazu ist eine Callback-Funktion erforderlich und dass Du die Teile, die erhalten werden sollen, im Pattern so klammerst, dass diese dann im jeweiligen Array für den Treffer erscheinen, der an die callback-Funktion übergeben wird. Diese baut dann das Replacement (Hier mit einem Zähler aus der globalen Variable i) zusammen und gibt es zurück:

<?php
$pattern = '/(<[hH][1-6])(>)(.*)(<\/[hH][1-6]>)/';


$subject = '
<h1>1) Erste, Erster Ordnung</h1>
<h2>1.1) Erstens, Erste Zweiter Ordnung</h2>
<h2>1.2) Erstens, Zweite Zweiter Ordnung</h2>

<h1>2) Zweitens, Erster Ordnung</h1>
<h2>2.1) Zweitens, Erste Zweiter Ordnung</h2>
<h2>2.2) Zweitens, Zweite Zweiter Ordnung</h2>
';


$foo=preg_replace_callback ( $pattern , 'replFunkt' , $subject , -1 , $count );

$i= 0;
function replFunkt( $ar ) {
	
	    print_r( $ar );
	    global $i;
	    $i++;
		return $ar[1] . ' id="A_' . $i . '"' . $ar[2] . $ar[3] . $ar[4];
}

print_r ( $foo ); print "\n";

Ausgaben:

Array
(
    [0] => <h1>1) Erste, Erster Ordnung</h1>
    [1] => <h1
    [2] => >
    [3] => 1) Erste, Erster Ordnung
    [4] => </h1>
)
Array
(
    [0] => <h2>1.1) Erstens, Erste Zweiter Ordnung</h2>
    [1] => <h2
    [2] => >
    [3] => 1.1) Erstens, Erste Zweiter Ordnung
    [4] => </h2>
)
Array
(
    [0] => <h2>1.2) Erstens, Zweite Zweiter Ordnung</h2>
    [1] => <h2
    [2] => >
    [3] => 1.2) Erstens, Zweite Zweiter Ordnung
    [4] => </h2>
)
Array
(
    [0] => <h1>2) Zweitens, Erster Ordnung</h1>
    [1] => <h1
    [2] => >
    [3] => 2) Zweitens, Erster Ordnung
    [4] => </h1>
)
Array
(
    [0] => <h2>2.1) Zweitens, Erste Zweiter Ordnung</h2>
    [1] => <h2
    [2] => >
    [3] => 2.1) Zweitens, Erste Zweiter Ordnung
    [4] => </h2>
)
Array
(
    [0] => <h2>2.2) Zweitens, Zweite Zweiter Ordnung</h2>
    [1] => <h2
    [2] => >
    [3] => 2.2) Zweitens, Zweite Zweiter Ordnung
    [4] => </h2>
)

<h1 id="A_1">1) Erste, Erster Ordnung</h1>
<h2 id="A_2">1.1) Erstens, Erste Zweiter Ordnung</h2>
<h2 id="A_3">1.2) Erstens, Zweite Zweiter Ordnung</h2>

<h1 id="A_4">2) Zweitens, Erster Ordnung</h1>
<h2 id="A_5">2.1) Zweitens, Erste Zweiter Ordnung</h2>
<h2 id="A_6">2.2) Zweitens, Zweite Zweiter Ordnung</h2>

Es lohnt sich reguläre Ausdrücke zu lernen.

Und wenn wir schon dabei sind: Auch das Menü kann gleichzeitig automatisch erzeugt werden:

<?php
$pattern = '/(<[hH][1-6])(>)(.*)(<\/[hH][1-6]>)/';


$subject = '
<h1>1) Erste, Erster Ordnung</h1>
<h2>1.1) Erstens, Erste Zweiter Ordnung</h2>
<h2>1.2) Erstens, Zweite Zweiter Ordnung</h2>

<h1>2) Zweitens, Erster Ordnung</h1>
<h2>2.1) Zweitens, Erste Zweiter Ordnung</h2>
<h2>2.2) Zweitens, Zweite Zweiter Ordnung</h2>
';


$i= 0;
$menue='<nav><ul>';
$foo=preg_replace_callback ( $pattern , 'replFunkt' , $subject , -1 , $count );
$menue .= '</ul></nav>';


function replFunkt($ar) {
	
	    print_r($ar);
	    global $i;
	    $i++;
	    global $menue;
	    $menue .= '<li><a href="#A_' . $i . '">' . $ar[3] . '</a></li>';
	    
		return $ar[1] . ' id="A_' . $i . '"' . $ar[2] . $ar[3] . $ar[4];
		
}

print_r ( $foo ); print "\n";
print_r ( $menue ); print "\n";
<nav><ul><li><a href="#A_1">1) Erste, Erster Ordnung</a></li><li><a href="#A_2">1.1) Erstens, Erste Zweiter Ordnung</a></li><li><a href="#A_3">1.2) Erstens, Zweite Zweiter Ordnung</a></li><li><a href="#A_4">2) Zweitens, Erster Ordnung</a></li><li><a href="#A_5">2.1) Zweitens, Erste Zweiter Ordnung</a></li><li><a href="#A_6">2.2) Zweitens, Zweite Zweiter Ordnung</a></li></ul></nav>