kostenloser Webspace werbefrei: lima-city


Problem mit preg_match in Schleife

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    s*************h

    Hallo lima-city Community,

    ich habe momentan ein Problem welches mich an den Rand des Wahnsinns ttag/re">reibt. Ich möchte aus einer XML-Datei eine bestimmte Informationen auslesen. Das XML-sieht so aus:
    <?xml version="1.0" encoding="utf-8"?>
    <info>
    	<description>Dies ist ein Test Plugin</description>
    	<name>Test Plugin</name>
    	<type>Component</type>
    	<version>1.0.0</version>
    	<key>none</key>
    </info>


    Die Funktion welche aus der XML-Datei lesen soll sieht so aus:
    function readInformation($info_file, $info_path) {
    	$text = '';
    	
    	$fp = fopen($info_file, 'r');
    	if($fp) {
    		while(!feof($fp)) {
    			$text .= fgets($fp);
    		}
    		
    		fclose($fp);
    	}
    	
    	foreach($info_path as $info) {
    		preg_match('/<'.$info.'>(.*)<\/'.$info.'>/i', $text, $res);
    		$text = $res[0]; //Zeile 80
    	}
    		
    	echo $text;
    }

    Der Parameter $info_file gibt den Pfad zur Datei an (dieser stimmt auch). $info_path ist ein Array welcher wie folgtaussieht:
    $path_array = array('info', 'version');

    Die Elemente des Arrays sollen dabei in der Reihenfolge im XML gefunden werden. Also erst info und dann version so das ich zum Schluss die Version auslesen kann.

    Doch ich bekomme folgenden Fehler:
    Undefined offset: 0 ... in Zeile 80

    Noch ein Hinweis: Ich weiß das es einen XML-Parser gibt, möchte aber diese Funktion hier einbauen mit einer solchen Funktionalität, d.h. ich möchte nicht auf die PHP-Klasse zurückgreifen müssen.

    Bin über jede Hilfestellung und Idee sehr dankbar.

    Gruß S.Brosch
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Lass dir mal über
    print_r($res);
    ausgeben was in $res steht.
    Du könntest auch das Ergebnis von preg_match auf 0 prüfen:
    if(preg_match(......) == 0) {
        echo('Error');
    }


    // Edit:
    <?php
    
    header('Content-Type: text/plain');
    
    $xmlfile = 'xmlregex.xml';
    
    function readInformation($info_file, $info_path) {
    	$text = '';
    
    	$fp = fopen($info_file, 'r');
    	if($fp) {
    		while(!feof($fp)) {
    			$text .= fgets($fp);
    		}
    
    		fclose($fp);
    	}
    
    	foreach($info_path as $info) {
    		preg_match('/<'.$info.'>(.*)<\/'.$info.'>/is', $text, $res);
    		$text = $res[1]; //Zeile 80
    	}
    
    	echo $text;
    }
    
    $path_array = array('info', 'version');
    
    readInformation($xmlfile, $path_array);
    
    ?>
    Das tut deinen Job. Du hast 2 Dinge vergessen:
    1) /is und nicht /i

    /i für Groß/Kleinschreibung ignorieren passt (obwohl das in XML zum falschen Ergebnis führen kann, da XML zwischen Groß- und Kleinschreibung unterscheidet!)

    /s für
    .
    = alle Zeichen + Zeilenumbruch. Ohne diesem Modifier wird der Ausdruck niemals passen, da . kein Zeilenumbruch sein kann!

    2) $res[1] = .*; $res[0] = der gesamte Ausdruck (also <info>.*</info>)

    Beitrag zuletzt geändert: 12.1.2012 19:43:34 von hackyourlife
  4. Autor dieses Themas

    s*************h

    Hallo hackyourlife,

    ich bin dir sehr dankbar für deine Hilfe. :thumb: Es funktioniert!!! :thumb: Das mit dem "s" im Regulären Ausdruck kannte ich noch nicht, werde es aber mal unter die Lupe nehmen.
    Punkt Nummer 2 deines Posts ist mir bewusst aber ich hatte den Quelltext umgebaut um alle zu erhalten, da ja nach dem ersten Durchlauf alle XML-Tags im Tag info erscheinen sollte, was nicht der Fall war.

    Nochmals vielen Dank und Gruß
    S.Brosch
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!