Datei rückwärts einlesen
MichelM
- php
Hallo,
ich möchte eine HTML-Datei rückwärts einlesen und in Tags und Text auflösen. Wenn ich aber den Dateizeiger mit fread auf das Dateiende setze gerade ich an EOF. Wieviele Bytes muss ich also vom filesize abziehen, damit ich nicht an das EOF gerate ?
$fcounter=filesize(meine.html);
$datei=fopen(meine.html,r);
while(fcounter>=0)
{
fseek($datei,$fcounter);
$inhalt+=fread($datei,1);
fcounter--;
}
fclose($datei);
CHMOD ist 777 ! Mit fgetss und fgetcsv lässt sich die Datei gut lesen, allerdings nützt mir das wenig, da ich rückwärts parsen muss. Die Datei vorwärts einlesen und das Array dann rückwärts auszulesen dauert zulange.
Oder denke ich gerade falsch ?
Danke schonmal !
Michael
Hallo Michel,
ich möchte eine HTML-Datei rückwärts einlesen
Warum willst du sowas tun?
und in Tags
und Text auflösen. Wenn ich aber den Dateizeiger mit fread
auf das Dateiende setze gerade ich an EOF.
Natuerlich ;)
Wieviele Bytes muss ich also vom filesize abziehen, damit
ich nicht an das EOF gerate ?
Das kommt darauf an, wieviele Bytes du einlesen willst.
Willst du 10 Byte einlesen, dann musst du an die Stelle 10
Byte vor dem Ende springen. Willst du 20 Byte einlesen, musst
du 20 Byte vor das Ende der Datei springen.
$fcounter=filesize(meine.html);
$datei=fopen(meine.html,r);
while(fcounter>=0)
{
fseek($datei,$fcounter);
$inhalt+=fread($datei,1);
fcounter--;
}
fclose($datei);
Ouch, das wuerde ich lassen. Eine Datei zeichenweise
einzulesen ist eine ganz schlechte Idee. Jeder fread()-Aufruf
gibt einen Systemcall, und jeder Systemcall kostet
Zeit -- und das nicht zu knapp.
Oder denke ich gerade falsch ?
Anzunehmen. Was genau moechtest du denn tun?
Gruesse,
CK
Hallo Christian,
ich möchte eine HTML-Seite in Ihre Bestandteile zerlegen und einem Array zuweisen,so ähnlich wie fgetcsv(), um vor INPUT-Tags einen Text zu formatieren, fehlende Attribute und Tasg einfügen. Mit fgetss() kann ich nur bestimmte Tags einlesen.
Also einen HTML-Konverter, dabei muss ich aber unabhängig von doctype erst herausfinden, ob es sich um XHTML oder HTML handelt.
Da mit PHP am Anfang demonstriere ich das mal mit JavaScript, das für solche Aufgaben viel zu langsam ist:
<script type="text/javascript"><!--
var alleTags=new Array(); var tempValue;var tmpHeader;var tmpallTags=new Array();
var tasten="accesskey";var tabulator="tabindex"; var summary='/<table summary="Text"/gi';
var seitenende="</body></html>";
var cutter=false;var j=0;var laenge=0;
function convertHTML(){
tmpValue=document.getElementById("Code").value;
removeHeader();
}
function work(){
alleTags=document.getElementsByTagName("*");
document.getElementById("Code").value="";
for(i=1;i<(alleTags.length-1);i++){
if(alleTags[i].tagName.toLowerCase()=="table"){
}
document.getElementById("Code").value+=alleTags[i].tagName;
}//endfor
}
function removeHeader(){
tmpallTags=tmpValue.split(">"); cutter=false;
fillout();laenge=tmpallTags.length-2;
}
function fillout(){
//for(j=0;j<=lange;j++){
tmpallTags[j].toLowerCase();
if(cutter==true&&tmpallTags[j].indexOf("</body")==-1){
document.getElementById("TmpCode").innerHTML+=tmpallTags[j]+">";
document.getElementById("bodysource").value+=tmpallTags[j]+">";
}
if(cutter==false&&tmpallTags[j].indexOf("</html")==-1){
document.getElementById("watchdog").value+=j+": "+tmpallTags[j]+">";
}
if (tmpallTags[j].indexOf("<body")!=-1){cutter=true;}
if(tmpallTags[j].indexOf("</body")!=-1){cutter=false;}
if(j<=laenge){mmId=setTimeout("fillout()",10);j++;}
//}
}
//-->
</script>
Hallo Michel,
ich möchte eine HTML-Seite in Ihre Bestandteile zerlegen
und einem Array zuweisen,so ähnlich wie fgetcsv(), um vor
INPUT-Tags einen Text zu formatieren, fehlende Attribute
und Tasg einfügen. Mit fgetss() kann ich nur bestimmte
Tags einlesen.
Eine interessante Aufgabe, aber nicht ganz einfach.
Prinzipiell wuerde ich so vorgehen: Datei komplett einlesen,
den String in 'Tokens' unterteilen und dann eine
hierarchische Struktur erstellen.
Das Tokenizing geht relativ einfach. Pruefe bei jedem
auftreten von <, ob ein Tag anfaengt. Faengt einer an, so
lies ihn bis zuende ein und speichere seine Attribute in
einem assoziativen Array oder so. Ist es ein leeres Element,
fahre weiter im Text. Ist das Element gefuellt (mit Text oder
Elementen ist dabei egal), starte eine neue Rekursionsstufe,
so dass aus einem HTML-Dokument wie diesem:
<html>
<head>
<title>text</title>
</head>
<body bgcolor="#FFFFFF">
<h1>text</h1>
<p>text</p>
</body>
</html>
folgende Struktur entsteht:
$tree = Array(
'name' => 'html',
'data' => '',
'attributes' => Array(),
'childs' => Array(
Array(
'name' => 'head',
'data' => '',
'attributes' => Array(),
'childs' => Array(
Array(
'name' => 'title',
'data' => '',
'attributes' => Array(),
'childs' => Array(
'name' => '#text',
'data' => 'text',
'attributes' => Array(),
'childs' => Array()
)
)
)
),
Array(
'name' => 'body',
'data' => '',
'attributes' => Array(
'bgcolor' => '#FFFFFF'
),
'childs' => Array(
Array(
'name' => 'h1',
'data' => '',
'attributes' => Array(),
'childs' => Array(
Array(
'name' => '#text',
'data' => 'text',
'attributes' => Array(),
'childs' => Array()
)
)
),
Array(
'name' => 'p',
'data' => '',
'attributes' => Array(),
'childs' => Array(
Array(
'name' => '#text',
'data' => 'text',
'attributes' => Array(),
'childs' => Array()
)
)
)
)
)
)
);
Hast du diese Struktur korrekt hergestellt, dann kannst du
die Informationen in einem (relativ einfachen) rekursiven
Algorithmus weiterverarbeiten -- optimieren, aufraeumen, etc.
Also einen HTML-Konverter, dabei muss ich aber unabhängig
von doctype erst herausfinden, ob es sich um XHTML oder
HTML handelt.
Oha -- unabhaengig vom Doctype ist so ohne weiteres aber nicht
moeglich. Ist kein Doctype angegeben, wuerde ich von HTML 4.01
oder so ausgehen.
Gruesse,
CK