Christoph Schnauß: Mit Regex Meta - Angaben auslesen ?

Beitrag lesen

hallo André,

Ich will die Description aus den Metatags lesen, also das was zwischen content="" steht.
/<meta name=[\s]*"description" content="(.*)"[\s]*/?>/is

Ja, das funktioniert ganz gut. Aber mal eine vergleichbare Aufgabenstellung, mit der ich noch nicht wirklich zurande gekommen bin:
Ein PHP-Script soll HTML-Dateien, die zum selben "Projekt" gehören, einlesen und darstellen. Das ist noch kein Problem. Jetzt hat das Script selbst aber schon einen Header-Bereich mit <!DOCTYPE...> und <meta ...>. Also müssen beim Einlesen von HTML-Dateien die dort befindliche Header gestrichen werden, damit valides HTML zustandekommt. Auch das ist noch kein allzu großes Problem, da die Header überall nahezu identisch sind. Bei einigen Seiten  -  nicht bei allen  -  gibt es aber zusätzliche <script ...>-Einschübe. Und da hänge ich.
Ich kann mir bisher nur so helfen, daß die Headerzeilen einzeln gelöscht werden. Das funktioniert zwar am Ende, ist aber bissel viel Tipperei. Was ich nicht richtig hinkriege, ist, _alles_, was zwischen <!DOCTYPE ...> und <body> steht, auf einen Rutsch rauszuwerfen, egal, welche Zeichen darin enthalten sind. Wenn ich den Suchausdruck nach dem Schema /<.+>/ "gierig" mache, hält er ja bei <body> nicht an, sondern frißt alles andere auch noch. Wenn ich ihn aber "genügsam" lasse, muß ich eben jede einzelne Header-Zeile bearbeiten.

Beispiel (wird etwas mehr Code, sorry):

<?php  
if ($QUERY_STRING == "blah"){  
echo <<<ENDE  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html><head><title>Projektname</title>  
<meta http-equiv="Content-Language" content="de">  
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">  
<link rel="stylesheet" type="text/css" href="allgemein.css">  
</head><body>  
<p>Hier wird eine Datei eingelesen</p><hr>  
ENDE;  
   $zeilen = fopen ("http://www.domain.tld/", 80);  
   $suchen[0] = "=([\r\n])[\s]+=";  
   $suchen[1] = "=<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 4.01 Transitional\/\/EN\">=";  
   $suchen[2] = "=<html><head><title>.*<\/title>=";  
   $suchen[3] = "=<meta http-equiv\=\"Content-Language\" content\=\"de\">=";  
   $suchen[4] = "=<meta http-equiv\=\"Content-Type\" content\=\"text\/html; charset\=windows-1252\">=";  
   $suchen[5] = "=<link rel\=\"stylesheet\" type\=\"text\/css\" href\=\"allgemein.css\">=";  
   $suchen[6] = "=</head><body>=";  
//   $ersetzen[0] = "\\1";  
//   $ersetzen[1] = "";  
   $ersetzen = "";  
   while (!feof($zeilen)) {  
   $ausgabe = fgets($zeilen,128);  
   echo preg_replace($suchen, $ersetzen, $ausgabe);}  
   echo "<p>&nbsp;</p><hr><a href='/'>zurück</a>\n";  
   echo "</body></html>";  
   exit();  
}

Das funktioniert einigermaßen zufriedenstellend. Ich möchte diesen ganzen Regex-Kram aber gerne in eine Variable packen, um dasselbe Ergebnis auf alle HTML-Dokumente des "Projekts" anwenden zu können  -  die einzelnen Seiten werden über jeweils veränderte Parameter aufgerufen. Und da gibts dann eben auch ein paar Seiten, die mit dem bisherigen Ausdruck nicht vollständig "erwischt" werden  -  sei es, daß noch irgendein anderer <meta> drinsteckt oder daß es eben <script>-Bereiche gibt oder zusätzlich <style>-Angaben für seitenspezifische Formatierungen abweichend von der zentralen CSS.

Grüße aus Berlin

Christoph S.