Problem mit preg_match in Schleife
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
ausdruck
auslese
code
datei
funktion
hilfestellung
info
job
kleinschreibung
lupe
nummer
offset
parameter
re
tag
test
text
wahnsinn
zeile
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Lass dir mal über
ausgeben was in $res steht.print_r($res);
Du könntest auch das Ergebnis von preg_match auf 0 prüfen:if(preg_match(......) == 0) { echo('Error'); }
// Edit:
Das tut deinen Job. Du hast 2 Dinge vergessen:<?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); ?>
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 -
Hallo hackyourlife,
ich bin dir sehr dankbar für deine Hilfe. Es funktioniert!!! 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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage