preg_match bricht komplettes Script ab (speichern der php-Datei)

TS-JC

Erfahrenes Mitglied
Hallo zusammen,

ich habe hier ein preg_match, welches beim Ausführen das php-Script abbricht und ich vom Browser gefragt werde, ob ich die Datei speichern möchte.

PHP:
preg_match("/<body.*?>((?:.|\s)*)<\/body>/im", $content, $matches);

Hole mir nur den body aus ner HTML Datei. (der Source kommt aus der Datenbank)
Die Datei weisst kein Script auf, sondern nur reines HTML und ein paar Tabellen.
Es scheint an einer speziellen Datei zu liegen, bei anderen funktioniert es.

Habe mich angenähert und die Stelle gefunden wo es Probleme gibt, dies isdt jedoch simpler HTML Source, welcher so ähnlich auch in den anderen Dateien zu finden ist.
Code:
<tr>
<td width="130" height="2"><img src="http://www.test.de/images/blub/cp.gif" border="0" alt="" width="130" height="2"/></td>
<td width="2" height="2"><img src="http://www.test.de/images/blub/cp.gif" border="0" alt="" width="2" height="2"/></td>
<td width="130" height="2"><img src="http://www.test.de/images/blub/cp.gif" border="0" alt="" width="130" height="2"/></td>
<td width="2" height="2"><img src="http://www.test.de/images/blub/cp.gif" border="0" alt="" width="2" height="2"/></td>

Hat preg_match eine Größenbeschränkung? Also nicht das ich wüsste.
Naja, vielleicht hat hier ja wer ne Idee.

thx4help
 
Moin,

Hast du schon mal deinen Browsercache geleert....ich könnte mir vorstellen, dass eine Altlast dort dies Problem verursacht.
Auf jeden Fall ist mehr Info in Form von Code notwendig, damit man sich dies z.B. mal nachstellen kann...ich hatte solche Probleme jedenfalls noch nicht mit PCRE-Funktionen.
 
Also mein Code tut nichts anderes als in $content den kompletten HTML Source zu packen.
Probiert als Abfrage aus der DB oder auch per file_get_contents.

Dann kommt eben der preg_match und danach habe ich (normal) dann in $matches[1] den kompletten Inhalt der Seite zwischen <body> und </body>
Das ist mein Ziel, ich möchte quasi die Inhalte von HTML Seiten auslesen, damit ich sie in ein neues CMS übertragen kann.

Per file_get_contents könnt ihr es mal hier testen wo es nicht geht:
http://www.tinkerwelt.de/tinkerpfer...53221398550cb6f52/53221398550cb6f4f/o000.html
Und hier wo es geht:
http://www.tinkerwelt.de/tinkerpfer...53221398550cb6f52/53221398550cb6f4f/d000.html
 
PHP:
<?php

$content = file_get_contents("http://www.tinkerwelt.de/tinkerpferdeirland/pferdeveranstaltungen/53221398550cb6f52/53221398550cb6f4f/o000.html");
#$content = file_get_contents("http://www.tinkerwelt.de/tinkerpferdeirland/pferdeveranstaltungen/53221398550cb6f52/53221398550cb6f4f/d000.html");

preg_match("/<body.*?>((?:.|\s)*)<\/body>/im", $content, $matches);  

?>

Das Ding in eine neue Datei, geht nicht. Ändere ich den Kommentar, so dass ich die 2. Datei ansteuer, dann gehts.
Also ich hocke hier an nem kubuntu Rechner, kanns evt irgendwie daran liegen?
 
Dein regulärer Ausdruck ist nicht gerade effizient. Probier mal folgenden:
PHP:
'/<body(?:[^>"\']+|"[^"]*"|\'[^\']*\')*>((?:[^<]+|<(?!\\/body))*)<\\/body>/is'
 
Klasse, herzlichen Dank.
MIt dem geht es nun.

Bin noch newbie was reguläre Ausdrücke angeht.
Meiner war noch bissle verständlich, wenn auch nicht von mir. Aber deinen verstehe ich 0 ;)
 
Ich erklär ihn dir gerne:
  • (?:[^>"']+|"[^"]*"|'[^']*')* beschriebt alles innerhalb des body-Tags: entweder beliebige Zeichen außer dem >, " und ' oder eben Attributwerte in Anführungszeichen. Ein einfaches [^>]+ reicht leider nicht aus, da das > in Attributwerten erlaubt ist.
  • (?:[^<]+|<(?!/body))* beschreibt beliebige Zeichen außer <, oder eben das <, dem aber kein /body wie in </body folgt ((?!/body), sog. negative look-ahead assertion).
Der Rest ist eigentlich nur Kleber, damit alles zusammenhält.
 
Zurück