• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage RegExp Teil2

Spoiler

Mitglied
Hallo Zusammen,

in meinem anderen Thread hatten wir ja schon die Zerlegung einer Zeichenkette besprochen.
Hier geht es jetzt um ein anderes Muster, deshalb habe ich einen neuen Thread gestartet.

Folgende Zeichnkette: "010:123456,004:Anton Weiß,006:Ab123"
Ich kann diese Kette nicht nach Komma teilen, da der SubString "Anton Weiß" auch Kommas enthalten kann und mir dann mein Ergebnis zerstört.

Meine Idee war nun ein RegExp via Lookahead => suche mit 3 Zahlen + ":" und alles, was vor "," + 3 Zahlen + ":" steht
Folgendes habe ich schon versuche: '/[0-9]{3}:[^,]*/'
Damit sucht er mir quasi was ich brauche, nur wenn der Substring in Komma enthält, schneidet er alles nach dem Komma ab.
Das ist nicht das Ziel.

Kann mir bitte jemand helfen?

Danke.
 
Werbung:
Reicht dir das nicht wenn du einfach
PHP:
$result = explode(':', $string);

dann kannst du dir ja $result mal ausgeben lassen
 
Das bringt mir das falsche Ergebnis.
Wenn ich das so mache, werhalte ich
ARRAY(0=>010, 1=>123456,004, 2=>Anton Weiß,006, 3=>Ab123)

Ich bräuchte aber
ARRAY(0=>010:123456, 1=>004:Anton Weiß, 2=>006:Ab123)

Und das eben analog, wenn statt "Anton Weiß" da "Anton, Weiß" drin stünde.
 
Werbung:
So?:
PHP:
$str = "010:123456,004:Anton Weiß,006:Ab123";
preg_match_all ("/([0-9:]*),(.*),([0-9]{3}:.*)/", $str, $matches);
var_dump($matches);
 
Zuletzt bearbeitet von einem Moderator:
Leider nein, das bringt mir den gesamten String als ein Ergebnis.

Als Delimiter ein Komma zu setzen ist ja das Problem, denn wenn dann im Text ein Komma steht, teilt er den Datensatz genau dort, wo er ihn nicht teilen soll.
Oder wie meinst du das?

Im Prinzip soll er ja das letzte Komma vor dem nächsten "[0-9]{3}:" (z.B."040:") erkennen und als Trennzeichen nutzen. Nur wie drücke ich das aus, dass genau das Komma gemeint ist und nicht einfach das nächste im Text?
 
Werbung:
Hier mal eine "fast" Lösung.
Dieser Ausdruck bringt mir quasi alles was ich brauche, bis auf den letzten Eintrag, der fehlt halt.

PHP:
preg_match_all ('/[0-9]{3}:.*?(?=,[0-9]{3}:)/', $Satz[0][0], $Feld);
 
Leider nein, das bringt mir den gesamten String als ein Ergebnis.
Hast Du dir das Ergebnis genau angesehen? Ich habe es nämlich getestet und es hat funktioniert. Im Ergebnis taucht als erstes der gesamte String auf, aber dahinter auch die Teilergebnisse entspr. Klammerung:
array(4) { [0]=> array(1) { [0]=> string(37) "010:123456,004:Anton, Weiß,006:Ab123" } [1]=> array(1) { [0]=> string(10) "010:123456" } [2]=> array(1) { [0]=> string(16) "004:Anton, Weiß" } [3]=> array(1) { [0]=> string(9) "006:Ab123" } }
 
Zuletzt bearbeitet von einem Moderator:
Hm, stimmt, die Teilstrings habe ich nicht angesehen ... sorry, mein Fehler.
Ich habe jetzt erstmal eine funktionierenden Lösung, den Rest teste ich dann mal nach meinem Urlaub ;-)

Könntest du mir auch noch bei der Zerlegung der Datensätze helfen?

im Prinzip sehen die Daten, die geliefert werden so aus:
PHP:
$str = "010:123456,004:Anton Weiß,006:Ab123;010:4567890,004:Bernd,008:Hygo12;";
Die Einzelnen Datensätze sind also mit einem ";" getrennt. Wenn nun "Anton;Weiß" drin steht, zerlegt es mir hier auch wieder die Teilung.

Oder gibt es sogar die Möglichkeit, den kompletten String so zu zerlegen, dass ich als Rückgabewert ein mehrdimensionales Array erhalte, so die Sätze und Felder gleich gesplittet sind?
 
Werbung:
Wenn du dir ein Format ausdenkst wie splitten willst, darfst du halt den delimiter nicht in die Strings nehmen, sonst ist immer gebastel...

nimm halt irgendwas als Delimiter, das nicht im String vorkommt oder setze auf einen Standard wie CSV
 
Der Vorschlag ist nicht schlecht ... den kann ich der SAP AG ja mal unterbreiten, vielleicht programmieren die ihre Ausgaben vom RFC-Query für mich entsprechend um ;)

Spaß beiseite: ich bekomme die Daten so und habe keinen Einfluß darauf, was als Delimiter benutzt wird.
Ich soll nur aus der Scheiße die Bonbons raussortieren :(
 
Ich würde die Zeichenfolge, die man eindeutig identifizieren kann, mit einem Separator ersetzen, den man eindeutig identifizieren kann und dann splitten:
Code:
$str = "010:123456,004:Anton; Weiß,006:Ab123;010:4567890,004:Bernd; Zimmer,008:Hygo12;";
$str2 = preg_replace("/;([0-9]{3}:)/", "___;___$1", $str);
echo $str2;
$arr = explode("___;___", $str2);
var_dump($arr);
 
Werbung:
Zurück
Oben