Überschriften per PHP finden
RW
- php
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
Hallo RW
- <H2>Text zum Filtern </H2>
.....- <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
Hallo Vinzenz
- <H2>Text zum Filtern </H2>
.....- <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
Hallo RW
- <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