HTML-Datei einlesen
CueMeX
- php
Moin..
Ich möchte eine HTML Datei in eine Variable einlesen lassen, so dass der Wuelltext der Datei dann der Inhalt der Variable ist.
In diesem Fall nehm ich mal meine page....
$host = "cuemex.cdaweb.de";
$file = fsockopen($host, 80);
fputs($file,"GET /index.html HTTP/1.0\r\nUser-Agent: XML Getter (Mozilla Compatible)\r\n\r\n");
while(!feof($file))
{
$page .= fgets($file);
}
fclose($file);
Aber der Inhalt der Variablen sieht wie fiolgt aus...
HTTP/1.1 200 OK
Date: Wed, 16 Jul 2003 19:55:52 GMT
Server: Apache/2.0.44 (Unix) DAV/2 PHP/4.3.0
Accept-Ranges: bytes
X-Powered-By: PHP/4.3.0
X-Accelerated-By: PHPA/1.3.3r2
Vary: Accept-Encoding,User-Agent
Connection: close
Content-Type: text/html; charset=ISO-8859-1
<html>
<head>
<title>Domain registriert</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<table width="100%" border="0" cellspacing="0" cellpadding="0" height="100%">
<tr>
<td>
<div align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="5">DIESE
DOMAIN IST VON EINEM KUNDEN / KUNDIN REGISTRIERT WORDEN</font></div>
</td>
</tr>
</table>
</body>
</html>
Weiß jemand wie ich das machen kann....
Die Zeile fputs($file,"GET /index.html [...] hab ich aus einem anderen Script, jedoch weiß ich nicht GEANU wieso ich diese Zeile brauch....
Für Erklärungen und Hilfen wäre ich dankbar..
MfG
CueMeX
hi,
Ich möchte eine HTML Datei in eine Variable einlesen lassen, so dass der Wuelltext der Datei dann der Inhalt der Variable ist.
na das ist ja mal ein richtig gelungener vertipper - so oft, wie man hier im forum im wahrsten sinne des wortes "wuehltext" vorgeworfen bekommt :-)
gruss,
wahsaga
UPs...
;-)
war echt ein kleiner Tippfehler....
Wie wohl aber jeder weiß mein ich Quelltext!
UPs...
;-)
war echt ein kleiner Tippfehler....
Wie wohl aber jeder weiß mein ich Quelltext!
Ich kann dir auch nur den Ansatz geben:
Nimm einfach alles zwischen <html> und </html> - fertig.
Das geht entweder umständlich mit String-Funktionen (hab aber keine Lust, mir die jetzt auszudenken), oder über eine kurze (und schnelle) Regular-Expression - dafür bin ich leider zu doof ;-P
Das Zeugs darüber ist der Header, damit der Browser weiss, mit was er es zu tun hat. Ich mach sowas übrigens so:
$quelltext=file('http://cuemex.cdaweb.de/');
Kann aber sein, dass man da auch noch den Header rausporkeln muss.
Grüße, Marcus
Jo danke....
Das mit dem header rausschmeißenis nich das problem...
das krieg ich hin.....
aber dann werd ich das gleich ma so versuchen wie du das vorgeschlegen hast...
aber mir wurde gesagt dass man mit file() nur dateien auf dem gleichen server benutzen kann.....
vielleicht geht es ja mit @file()
Hallo CueMeX,
aber mir wurde gesagt dass man mit file() nur dateien auf dem gleichen server benutzen kann.....
Nein, dann wurde Dir falsches erzählt. Im Normalfall funktioniert das auch mit fremden Rechnern. Bei einigen Hostern _könnte_ dieses Feature deaktiviert sein, ich halte es aber für unwarscheinlich.
vielleicht geht es ja mit @file()
Im Erfolgsfall sind file und @file identisch. Im Fehlerfall bekommst Du bei letzterem die Fehlermeldungen nicht mit und weißt daher nicht, woran es liegen könnte, dass es nicht klappt.
Viele Grüße,
Christian
Hallo!
Wie bereits ein Vorredner gesagt hat: Du solltest vielleicht doch besser die url_fopen_wrappers nehmen. Aber ich will Dir dennoch etwas über die Vorgehensweise hier erzählen:
fputs($file,"GET /index.html HTTP/1.0\r\nUser-Agent: XML Getter (Mozilla Compatible)\r\n\r\n");
Diese Zeile bewirkt, dass folgendes an den Webserver gesendet wird:
GET /index.html HTTP/1.0
User-Agent: XML Getter (Mozilla Compatible)
\r\n ist der Zeilentrenner im HTTP-Universum und zwei aufeinanderfolgende Zeilentrenner heißen: "Hier ist der Header zu Ende")
Ich würde an Deiner Stelle einen anderen User-Agent senden. Vielleicht sogar gar keinen. Dafür würde ich in Zeiten von virtuellen Hosts einen Host-Header mitsenden, der den Hostnamen beinhaltet. Die Tatsache, dass Du HTTP/1.0 verwendest, ist gut, dann brauchst Du kein Transfer-Encoding: chunked interpretieren müssen. Ein Host-Header ist im Zusammenhang mit HTTP/1.0 zwar nicht 100% in Ordnung, aber nachdem Netscape 4 es auch so macht und dieser in dieser HTTP-Hinsicht keine Probleme hat, kann man das so lassen.
Deine Anfrage sieht also so aus:
GET /index.html HTTP/1.0
Host: cuemex.cdaweb.de
Du musst also folgenden String an den Server senden:
"GET /index.html HTTP/1.0\r\nHost: cuemex.cdaweb.de\r\n\r\n"
Der Server antwortet Dir dann mit Daten. Diese Daten bestehen aus Header und Body. Header und Body werden wieder durch zwei Zeilentrenner getrennt. Du trennst sie also:
list ($header, $body) = explode ("\r\n\r\n", $page, 2);
Nun steht in $header der Header und in $body der Body. In $body ist die komplette HTML-Seite enthalten. Doch bevor Du Dich jetzt zu arg freust, solltest Du erst einmal schauen, was der Server Dir geantwortet hat. Den Header solltest Du nach dem Zeilentrenner auftrennen:
$headers = explode ("\r\n", $header);
Dann solltest Du Dir die ersten drei Zeichen von der ersten Zeile anschauen:
$statuscode = substr ($headers[0], 0, 3);
Die Variable $statuscode enthält nun den Statuscode der Antwort des Servers. Wenn der Statuscode gleich 200 ist, dann ist alles in Ordnung. Wenn der Statuscode gleich 404 ist, dann ist die Resource nicht gefunden worden. Eine Liste aller HTTP-Statuscodes findest Du hier: http://selfhtml.teamone.de/diverses/httpstatuscodes.htm
Wenn Du es ganz professionell machen willst, dann solltest Du noch den Rest der Header korrekt parsen, damit Du Dir wirklich ganz sicher sein kannst.
Allerdings wie schon bereits am Anfang gesagt: Mit einem fopen ('http://.../index.html', 'r'); bist Du viel schneller am Ziel, da PHP Dir die ganze HTTP-Arbeit abnimmt.
Viele Grüße,
Christian
Ok vielen Dank..
mit dem ""GET /index.html HTTP/1.0\r\nHost: cuemex.cdaweb.de\r\n\r\n""
Funktioniert es jetzt.....
Also noch mal vielen Dank an alle...
Hallo CueMex
$host = "cuemex.cdaweb.de";
$file = fsockopen($host, 80);
fputs($file,"GET /index.html HTTP/1.0\r\nUser-Agent: XML Getter (Mozilla Compatible)\r\n\r\n");
while(!feof($file))
{
$page .= fgets($file);
}
fclose($file);Aber der Inhalt der Variablen sieht wie fiolgt aus...
[snip]
Das, was dort oberhalb des HTML-Dokuments in der Variablen steht, sind die HTTP-Header. Bei einer korrekten Übertragung sind diese vom Body der HTTP-Message, in diesem Falle das HTML-Dokument, durch zwei Leerzeilen, die mit Carriage Return ('\r') und Linefeed ('\n') beendet werden getrennt.
Weiß jemand wie ich das machen kann....
$message = explode("\r\n\r\n", $page, 2); // http://www.php.net/manual/en/function.explode.php
In $message[1] solltest du dann das HTML-Dokument vorfinden.
Schönen Abend noch
Johannes
NACHTRAG:
Ich hab die Tips noch nicht verwendet. (Mach ich natürlich noch)
ABER
Auf die Art, mit der ich das vorher gemacht habe... (siehe erstes Posting)
wird ein anderer Quelltext für die Page vom Server gesendet, als man mit dem Browser erhält....
Woran liegt das???
Vielleicht an dem "nUser-Agent: XML Getter (Mozilla Compatible)"???
MfG
CueMeX
Hallo CueMeX,
Ich hab die Tips noch nicht verwendet.
Gut zu wissen, denn:
Auf die Art, mit der ich das vorher gemacht habe... (siehe erstes Posting)
wird ein anderer Quelltext für die Page vom Server gesendet, als man mit dem Browser erhält....
Woran liegt das???
Du sendest keinen Host-Header, daher wird folgende Seite an Dich ausgeliefert: http://193.254.212.135/ Mit einem Host-Header bekommst Du dann auch die richtige Seite.
Denn es ist im Internet Praxis, mehrere Hosts auf einem Rechner unter der gleichen IP laufen zu lassen. Und die einzige Möglichkeit für einen Webserver zu wissen, welcher Host gemeint ist, ist durch eine Mitteilung durch den Browser. Und diese Mitteilung durch den Browser erfolgt durch den Host-Header.
Viele Grüße,
Christian