2016-03-24 19 views
2

ich ein String wie folgt aus:, regex

'1': '-' '10': CustomerA; 79,00 EUR/Std '11': CustomerB; 155,00 EUR/Std '12': CustomerC; 75,00 EUR/Std '13': CustomerD; 50,00 EUR/Std '2': CustomerA; 000 EUR/Std '3': CustomerA; 000 EUR/Std '4': CustomerA; 120,00 EUR/Std '5': Customer; 75,00 EUR/Std 

Bessere Sicht:

'1': '-' 
'10': CustomerA; 79,00 EUR/Std 
'11': CustomerB; 155,00 EUR/Std 
'12': CustomerC; 75,00 EUR/Std 
'13': CustomerD; 50,00 EUR/Std 
'2': CustomerA; 000 EUR/Std 

Und versuchen, ein Array mit diesen Daten zu erhalten:

array(
'key' => <CustomerName>; <Price> EUR/Std, 
...); 

Ich hatte das schon versucht, aber es funktioniert nur, wenn es Wortumschläge gibt.

$string = preg_split('[0-9+]', $string); 
$pattern = "~^'(\d+)':\s+(.+)$~mx"; 

preg_match_all($pattern, $string, $matches); 
$result = array_combine($matches[1], $matches[2]); 

Können Sie mir helfen, dieses Problem zu lösen?

Antwort

2

Sie dieses Muster ohne Splitting Zeichenfolge verwenden können:

~ 
'\d+':  # one-or-more digits wrapped by single quotes, followed by colon 
\s+   # one-or-more spaces 
([^']+)  # group 1: one-or-more not-single quote char 
;   # semicolon 
\s+   # one-or-more spaces 
(.+?)  # group 2: one-or-more character, ungreedy option 
\s+   # one-or-more spaces 
(EUR/\w+) # group 3: literally “EUR/” followed by one-or-more word chars 
~x 

regex101 demo

Die Gruppen sind:

  1. Kunden
  2. Preis
  3. Währungs

In Gruppe 1 I jede nicht-quote Zeichen verwenden, um erstes leeres '1:' Spiel zu vermeiden.


Varianten:

  1. Wenn Sie mehr Währungs Varianten haben, ersetzen (EUR/\w+) mit (\w+/\w+)
  2. Wenn die /Std ist optional, ersetzen (EUR/\w+) mit (EUR(/\w+)?) oder (\w+(/\w+)?)
+0

Was ist, wenn der Preis nicht immer 'EUR/Std' ist? – Phate01

+0

@ Phate01 Ich habe alles in EUR (wie das Beispiel vorausgesetzt). Aber ich werde eine Variante hinzufügen. Vielen Dank. – fusion3k

+0

Ich weiß, aber sehr oft gibt es immer einen anderen Fall, den wir vielleicht nicht kennen – Phate01

0

Vielen Dank für die kompetente Antwort. Ich habe Ihr $pattern ein litl Bit dazu ändern:

~'(\d+)+':([^']+;\s+.+?)\s+(EUR/\w+)~x 

Ich brauche nur die ID und die Kunden Unternehmen mit dem Preis. Dann benutze ich eine explode Funktion.

+0

Sind Sie sicher über diesen Weg? Sie können bereits getrennte Werte haben: Warum verdoppeln Sie den Job? – fusion3k

+0

Ich brauche foreach Rekord 3 Werte: ID, Name der Firma und Float-Preis. EUR/Std ist nicht notwendig. –