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>