RW: Überschriften per PHP finden

Meine test.html hat diesen Inhalt
......
1. <H2>Text zum Filtern </H2>
.....
2. <H2 ALIGN="CENTER"><A NAME="exkurs"></A>Text zum Filtern</H2>
.....

Wenn ich die test.htm filter bekomme ich nur den ersten Text als Ergebniss für $s

Was muss ich machen um auch die zweite Überschrift auslesen zu können ?

<?
$filter ="<h2>(.*)</h2>";
$datei ="test.htm";
$modus = "r";

if ($fp=fopen($datei,$modus)) {
 while (!feof ($fp))
{
       $linie = fgets($fp, 100);

//Mein  Ansatz für Code  (<h2(.*)>){1}(.*?)(</h2> anstelle von "<h2>(.*)</h2>"  geht aber nicht

if(eregi($filter, $linie, $title))

$chr=fgetc($fp);
$chr;
$title = $title[1];

if (!empty ($title[1]))
{

$s .= $title." ";
        }
}
 }
else
(fclose($fp));

echo "$s";

?>

Danke RW

  1. Hallo RW

    1. <H2>Text zum Filtern </H2>
      .....
    2. <H2 ALIGN="CENTER"><A NAME="exkurs"></A>Text zum Filtern</H2>

    ^^^
    Hier folgt auf H2 ein Leerzeichen

    .....
    Was muss ich machen um auch die zweite Überschrift auslesen zu können ?
    $filter ="<h2>(.*)</h2>";

    ^^^
    Schau' mal, Du verlangst explizit ein Ende des Tags.
    Zudem solltest Du auf Groß- und Kleinschreibung achten.

    Gruss,

    Vinzenz

    1. Hallo Vinzenz

      1. <H2>Text zum Filtern </H2>
        .....
      2. <H2 ALIGN="CENTER"><A NAME="exkurs"></A>Text zum Filtern</H2>
                ^^^
        Hier folgt auf H2 ein Leerzeichen

      Das ist nur ein Beispiel es könnte jede andere *.htm sein

      .....
      Was muss ich machen um auch die zweite Überschrift auslesen zu können ?
      $filter ="<h2>(.*)</h2>";
                     ^^^
      Schau' mal, Du verlangst explizit ein Ende des Tags.
      Zudem solltest Du auf Groß- und Kleinschreibung achten.

      Das verstehe ich nicht!!

      if(eregi($filter, $linie, $title))
      erigi = Groß bzw. Klein ist egal oder so?

      Wie kann ich den /$filter/ umschreiben das er alles zwischen <h2.....> entfernt ?

      RW

      1. Hallo RW

        1. <H2 ALIGN="CENTER"><A NAME="exkurs"></A>Text zum Filtern</H2>
                  ^^^
          Hier folgt auf H2 ein Leerzeichen
          Das ist nur ein Beispiel es könnte jede andere *.htm sein

        Nein, es get um Deinen Filter.

        Was muss ich machen um auch die zweite Überschrift auslesen zu können ?
        $filter ="<h2>(.*)</h2>";
                       ^^^

        Du suchst hier explizit nach etwas, was mit <h2> anfängt,
        <h2 align=...> fängt _nicht_ mit <h2> an

        Zudem solltest Du auf Groß- und Kleinschreibung achten.

        Das verstehe ich nicht!!

        if(eregi($filter, $linie, $title))
        erigi = Groß bzw. Klein ist egal oder so?

        Da hast Du recht, hab' ich übersehen :-(

        Wie kann ich den /$filter/ umschreiben das er alles zwischen <h2.....> entfernt ?

        1. Nun ja, du suchst zuallererst mal _alle_ Übereinstimmungen.
        2. Wenn Du die gefunden hast, dann darfst Du die Tags entfernen.

        Zu 1.
        Meine PHP-Doku (Programming PHP von Rasmus Lerdorf & Kevin Tatroe) besagt, dass die POSIX-regexps gierige Quantifier haben, d.h. der * in <h2>(.*)</h2> sorgt dafür, dass Du exakt das erste <h2> und das letzte </h2> im Text bekommst. Das ist sicher nicht was Du willst.

        Ich habe es mit den Perl-kompatiblen regulären Ausdrücken hinbekommen:

        Filter: '/(<h2(.*?)</h2>/i'
        Anmerkungen: Du darfst nur nach dem Tag-Anfang suchen, d.h, nach <h2
        In (.*?) bedeutet das ?, dass das erste Auftreten von </h2> nach <h2 gesucht wird, minimal gieriges Verhalten, und den / in </h2> brauchst Du, um den Backslash zu maskieren.
        Das Muster wird in / / eingepackt, das angehängte i bedeutet case-insensitive.

        Die Funktion, die Du anwenden solltest, ist
        preg_match_all(Muster, Text, Vorkommen, [Reihenfolge])
        http://www.php.net/manual/en/function.preg-match-all.php
        Diese findet alle Vorkommen, die in ein Array geschrieben werden.

        Zu 2.
        Auf die Elemente dieses Arrays solltest Du dann strip_tags() anwenden:
        http://www.php.net/manual/en/function.strip-tags.php
        Natürlich filterst Du Dir damit auch noch alle anderen HTML-Tags heraus. Andrerseits hast Du dann Strings, in denen die Kombination <h2 ... </h2> genau einmal vorkommt. Falls Du also alle anderen HTML-Tags behalten willst, dann kannst Du jetzt mit anderen Regexps weiterarbeiten.

        Viel Erfolg!

        Gruss,

        Vinzenz