Hallo,
Wie gesagt habe ich eine Lösung mit Regulären Ausdrücken aber da eigentlich alle möglichen Zeichen vorkommen können, wird das ganze dadurch sehr erschwert.
Könnte man vielleicht auch die Zeilen mit "file()" in ein Array lesen und dann versuchen mit "explode" nach leerstellen die einzelnen Elemente herauszufiltern?
Naja, Du kannst das auch einfach per fgetcsv() einlesen und dem den Blank als Delimiter übergeben:
$fp = fopen('datei', 'r');
while (($record = fgetcsv ($fp, 8192, ' ')) !== false) {
// Leerzeile oder ungültige Zeile (3 Eintäge mindestens)
if (count($record) <= 3) continue;
// Ersten Eintrag entfernen
$prefix = array_shift ($record);
// Ungültige Zeile
if ($prefix != '*UIConstraints:') {
continue;
}
// Hole option 1
$option1 = array_shift ($record);
if ($option1[0] != '*') {
continue; // Ungültig
}
$option1 = substr ($option1, 1); // * entfernen
// Hole option 2
$option2 = array_shift ($record);
if ($option2[0] != '*') {
// Ok, ist doch nicht Option 2, sondern Wert 1
$wert1 = $option2;
// Ungültig
if (!count ($record)) {
continue;
}
$option2 = array_shift ($record);
if ($option2[0] != '*') {
continue; // ungültig
}
$option2 = substr ($option2, 1); // * entfernen
} else {
$wert1 = NULL;
$option2 = substr ($option2, 1); // * entfernen
}
// Hole Wert 2
if (count ($record)) {
$wert2 = array_shift($record);
} else {
$wert2 = NULL;
}
// Ungültig
if (count ($record)) {
continue;
}
// Nun enthalten $option1, $wert1, $option2 und $wert2 die gewünschten
// Daten. $wert1 und $wert2 können NULL sein.
// Jetzt halt in die DB kloppen...
}
fclose ($fp);
Man könnte hier vmtl. noch ein paar Dinge verbessern, aber in der Form sollte der Algorithmus sehr einfach zu verstehen sein.
Darf ich übrigens mal fragen, was das für ein seltsames Dateiformat ist? ;-)
Viele Grüße,
Christian