Hallo,
Ich habe hier ein Copy&Paste eines Webseiteninhalts, aus dem ich verschiedene Daten extrahieren will. So ein C&P sieht beispielsweise so aus:
Galaxie 4 - System 3 - Position Systemzentrum: -10011.-11923.9295
1 Tattooine Darth_Vader [DZ] 552 XXX
2 Kappeln-2 Ghost-Raider [MOWL] 118 XXX
3 ODINSFESTE THYRRUS [Pimps] 5.482 XXX
4 unknown Hagbard§ Celine [DZ] 377 XXX
5 Bahamut 7 Red Claw4 [UnAt] 280 XXX
6 War The master [TB] 401 XXX
7 unknown alex-one 358 XXX
8 Trantor Tom Paris [UFoPs] 83 XXX
9 XXX
10 unknown spubbl [=SW=] 121 XXX
11 unknown alex-one 159 XXX
[mehr ..]
Problemstellung: Hier soll mittels RegExp und preg_match_all pro Zeile Planetennummer, Planetenname, Spielername, Allianzname (immer in eckicken Klammern), Punktzahl extrahiert werden. Alle Namen können hierbei alle Zeichen, inklusive Leerzeichen, enthalten, die Punktzahl kann einen Tausender-Trenner (.) enthalten. Die einzelnen Elemente sind durch mindestens 2 Leerzeichen getrennt.
Somit kam ich zu folgendem regulären Ausdruck:
So, das Suchmuster klappt auch perfekt, solange eine Zeile ALLE Elemente enthält. Sobald aber wie z.B. bei der mit "9" beginnenden Zeile alles bis auf das XXX am Schluss fehlt - oder irgendeine andere Angabe, dan führt die Abfrage zu fehlerhaften Ergebnissen. Bei Zeile 9 z.B.:
also wird planet 10 nicht richtig gefunden. ich habe schon versucht, den String vor der Suche per
von den \r und \n zu befreien - aber das half nichts, das Ergebnis war identisch mit dem obigen (\r und \n sind immer noch drin).
Kann man die RegExp irgendwie so schreiben, dass sie sowas abfängt und Zeilen, in denen Spielername und Planetenname fehlen NICHT berücksichtigt?
Ich danke schon mal für eure Hilfe...
mardeluk
Ich habe hier ein Copy&Paste eines Webseiteninhalts, aus dem ich verschiedene Daten extrahieren will. So ein C&P sieht beispielsweise so aus:
Galaxie 4 - System 3 - Position Systemzentrum: -10011.-11923.9295
1 Tattooine Darth_Vader [DZ] 552 XXX
2 Kappeln-2 Ghost-Raider [MOWL] 118 XXX
3 ODINSFESTE THYRRUS [Pimps] 5.482 XXX
4 unknown Hagbard§ Celine [DZ] 377 XXX
5 Bahamut 7 Red Claw4 [UnAt] 280 XXX
6 War The master [TB] 401 XXX
7 unknown alex-one 358 XXX
8 Trantor Tom Paris [UFoPs] 83 XXX
9 XXX
10 unknown spubbl [=SW=] 121 XXX
11 unknown alex-one 159 XXX
[mehr ..]
Somit kam ich zu folgendem regulären Ausdruck:
PHP-Code:
$suchmusterPlaneten = "%([0-9]+)\s{2,}([\S\s]+)\s{2,}([\S\s]+)\s{2,}(\[[\S\s]+\])\s{2,}([0-9\.]+)\s{2,}xxx%Uim";
So, das Suchmuster klappt auch perfekt, solange eine Zeile ALLE Elemente enthält. Sobald aber wie z.B. bei der mit "9" beginnenden Zeile alles bis auf das XXX am Schluss fehlt - oder irgendeine andere Angabe, dan führt die Abfrage zu fehlerhaften Ergebnissen. Bei Zeile 9 z.B.:
Array
(
[0] => Array
(
[0] => 1 Tattooine Darth_Vader [DZ] 531 XXX
[1] => 2 Kappeln-2 Ghost-Raider [MOWL] 118 XXX
[2] => 3 ODINSFESTE THYRRUS [Pimps] 548 XXX
[3] => 4 unknown Hagbard Celine [DZ] 377 XXX
[4] => 5 Bahamut 7 Red Claw [UnAt] 280 XXX
[5] => 6 War The master [TB] 401 XXX
[6] => 7 unknown alex-one 358 XXX
[7] => 8 Trantor Tom Paris [UFoPs] 83 XXX
[8] => 9 klar nivhz 999 XXX\r\n10 unknown spubbl [SW=] 121 XXX
[9] => 11 unknown alex-one 159 XXX
[10] => 12 jeporgia Karlson 204 XXX
)
(
[0] => Array
(
[0] => 1 Tattooine Darth_Vader [DZ] 531 XXX
[1] => 2 Kappeln-2 Ghost-Raider [MOWL] 118 XXX
[2] => 3 ODINSFESTE THYRRUS [Pimps] 548 XXX
[3] => 4 unknown Hagbard Celine [DZ] 377 XXX
[4] => 5 Bahamut 7 Red Claw [UnAt] 280 XXX
[5] => 6 War The master [TB] 401 XXX
[6] => 7 unknown alex-one 358 XXX
[7] => 8 Trantor Tom Paris [UFoPs] 83 XXX
[8] => 9 klar nivhz 999 XXX\r\n10 unknown spubbl [SW=] 121 XXX
[9] => 11 unknown alex-one 159 XXX
[10] => 12 jeporgia Karlson 204 XXX
)
also wird planet 10 nicht richtig gefunden. ich habe schon versucht, den String vor der Suche per
PHP-Code:
str_replace (array("\r","\n")," ",$String);
Kann man die RegExp irgendwie so schreiben, dass sie sowas abfängt und Zeilen, in denen Spielername und Planetenname fehlen NICHT berücksichtigt?
Ich danke schon mal für eure Hilfe...
mardeluk
Kommentar