Hallo,
ich hoffe auf Hilfe bei einem Problem mit der strpos Funktion in php.
Ich versuche per PHP eine xml-Datei einzulesen (file_get_contents) und dann aus deren Inhalt (der einen HTML-ähnlichen Aufbau hat) alle Tabellen nach bestimmten Markern (z.B: <Tablelle>Ihnalt</Tabelle>) auszulesen, einige Einfügungen und Ersetzungen durchzuführen und das Ganze dann in eine neue xml-Datei zu speichern.
Dabei verwende ich die strpos-Funktion um den Inhalt der xml Blockweise abzuarbeiten bzw. die Tabellenelemente auszulesen.
Das Problem ist nun, dass strpos dabei in einer for-Schleife laufen muss.
Nun hat sich das Script immer aufgehängt. Mit einigen Versuchen konnte ich feststellen, dass strpos das Ende der XML-Datei bzw. des Content-Strings (EOF) nicht erkennt (https://bugs.php.net/bug.php?id=25781).
Ich habe nun versucht das Script abzubrechen indem ich am Ende und am Anfang der for-Schleife prüfe ob ich über EOF hinaus wieder am Anfang des Content-Strings angelangt bin. Ich erhalte aber immernoch aus einer 120 KB Quelldatei eine 10 MB Ausgabedatei. Ich hoffe es kann mir jemand hierzu einen Rat geben.
Hier ein Beispielcode:
<?php
/*
In $xml_content stehen Elemente wie:
<Tabelle tag="100" anderertag="20">Inhalt</Tabelle>
*/
function makeNewXML($xml_content){
// die Länge des Content-Strings
$imaxxml = strlen($xml_content);
$istop = 0;
$lastj = -1;
$j=0;
for($j=0;$j<$imaxxml;$j++){
// echo $j." ".$imaxxml."\r\n";
if($lastj > $j){
break;
}
$lastj = $j;
$findatable = strpos($xml_content,"<Tabelle",$istop);
if($findatable !== false){ // Tabelle gefunden
$istart = $findatable;
$iendtag = strpos($xml_content,">",$istart);
$string = substr($xml_content,$istart,$iendtag-$istart);
$newXMLContent .= substr($xml_content,$istop,$istart-$istop); // Das XML vor der gefunden Tabelle übernehmen
$istop = strpos($xml_content,"</Tabelle>",$istart)+strlen("</Tabelle>");
// hier folgt dann das Auswerten und Umformen dieser Tabelle
// ...
// ...
$j = $istop;
}else{ // keine Tabelle gefunden
$newXMLContent .= substr($xml_content,$istop,$imaxxml-$istop); // den Rest des XML mitnehmen
$j = $imaxxml; // break
}
}
return $newXMLContent;
};
?>
Vielen Dank für die Hilfe,
Alex