Alex: strpos EOF Problem

Beitrag lesen

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