phpbar.de logo

Mailinglisten-Archive

[php] Stringfunktionen / parsing

[php] Stringfunktionen / parsing

Lutz Zetzsche php at sea-rescue.de
Mon Aug 18 10:52:35 CEST 2003


Hi Oliver,

Am Montag, 18. August 2003 04:13 schrieb Oliver \:
[...]
> Jetzt aber zur Problemstellung:
> Ein User läd wöchentlich Aktualisierungen für seine Homepage als
> Textdatei (bzw XML) hoch, die folgendermaßen aufgebaut ist:
> <aktualisierung><artikel><id>A</id><titel>B</titel><beschreibung>C</b
>eschrei
> bung></artikel><artikel><id>AA</id><titel>BB</titel><beschreibung>CC<
>/beschr eibung></artikel></aktualisierung>
> Nun versuche ich, für jeden "artikel"-block die Werte zwischen den
> Tags in entsprechende Variablen einzulesen, so dass soetwas ensteht:
> $id = A
> $titel = B
> $beschreibung = C
> Nur irgendwie will mir kein Weg einfallen, wie ich den
> umgangssprachlichen Vorgang "Nimm alles, was zwischen den Tags XYZ
> steht und packe es in die Variable mit dem entsprechenden Namen XYZ;
> mache das für die komplette Datei" in Code umsetzen kann... mit sowas
> hatte ich bisher nie zu tun :(

es geht aus Deiner Mail nicht genau hervor, ob Deine XML-Datei
zeilenweise aufgebaut ist. Die XML-Datei sollte zeilenweise aufgebaut
sein, damit Du sie auch zeilenweise mit fgets() auslesen kannst. Das
ist sicherer als das Auslesen der Datei auf einen Schlag mit file(),
weil file() nach meiner Erfahrung beim Einlesen zu grosser Dateien
mindestens Performanzprobleme mit sich bringt und ggf. sogar einen
Fehler produziert.

Relevante Seiten aus der Doku:
- http://de.php.net/manual/de/ref.filesystem.php
- http://de.php.net/manual/de/function.file.php
- http://de.php.net/manual/de/function.fopen.php
- http://de.php.net/manual/de/function.feof.php
- http://de.php.net/manual/de/function.fgets.php
- http://de.php.net/manual/de/function.fclose.php

Also angenommen, Deine Datei sieht jetzt so aus:

<aktualisierung>
<artikel><id>A</id><titel>B</titel><beschreibung>C</beschreibung></artikel>
<artikel><id>AA</id><titel>BB</titel><beschreibung>CC</beschreibung></artikel>
</aktualisierung>

Dann liest Du jetzt mit fgets() die Datei zeilenweise aus (Beispiel ist auf der
Seite http://de.php.net/manual/de/function.fgets.php), wobei Du die erste und
die letzte Zeile (<aktualisierung> / </aktualisierung>) auslaesst, und
verarbeitest die Zeile z.B. wie folgt:

Du ermittelst die Start- und Endposition des jeweiligen Tags mit strpos() und
strrpos(). Die Differenz daraus plus die Laenge des Start-Tags ergibt dann die
Laenge der Zeichenkette zwischen Start- und End-Tag. Mit diesen Werten
schneidest Du dann mit substr() den enthaltenen Wert heraus. Beispiel,
ungetestet:

$iStart = strpos($sZeile, '<title>') + strlen('<title>');
$iEnde = strrpos($sZeile, '</title>');
$iLaenge = $iStart - $iEnde;
$sInhalt = substr($zeile, $iStart, $iLaenge);

Relevante Seiten aus der Doku:
- http://de.php.net/manual/de/function.strpos.php
- http://de.php.net/manual/de/function.strrpos.php
- http://de.php.net/manual/de/function.strlen.php
- http://de.php.net/manual/de/function.substr.php

Wenn ich jetzt in der Fruehe nix falsch gemacht habe, sollte es so in etwa
funktionieren. Bei regulaeren Ausdruecken bin ich auch nicht so bewandert. ;-)
Da kann aber bestimmt jemand noch einen Loesungsansatz anbieten. :-)

Fuer mehrere Tags sollest Du bei meinem Loesungsansatz oben dann eine Schleife
durchlaufen lassen und in die Zeilen die Tags automatisch aus einem Array
einsetzen und den Inhalt auch in einen Array schreiben und von dort spaeter
wieder auslesen. :-)

Viele Gruesse

Lutz

php::bar PHP Wiki   -   Listenarchive