Servus,
([0-9]+) die Ziffernzeichen 1 bis n Mal, warum in Klammern?
Weil dieser Teil des Ausdrucks weiterverarbeitet werden soll (s.u.)
[^0-9]* Alle Zeichen, die keine Ziffern sind 0 bis n Mal
Warum "keine Ziffern?" es dürfte da doch im Prinzip nichts anderes als Whitespace stehen, oder?
Doch, da darf die Einheit stehen, mit oder ohne Leerzeichen davor.
i case Insensitive, wieso? sind doch keinen Lettern da?
Ja, das spielt hier keine Rolle, aber es schadet auch nicht ;)
", "\1.\4", $string) und da verließen sie ihn. Backreferenzen? was bedeuten die?
Backreferenzen sind die gefundenen Teilausdrücke die in Klammern gepackt sind. Um auf die Zahl zu kommen, muss man einfach die Klammern durchzählen:
([0-9]+)((,|.)([0-9]+))?
^------^ \1
^--------------^ \2
^----^ \3
^------^ \4
Wir wollen nur \1 (die Vorkomma-Stellen) und \4 (die Nachkomma-Stellen). \3 (das Komma) und \4 (Komma + Nachkomma-Stellen) interessieren uns nicht, genausowenig wie alles was danach kommt (Einheit), weil wir selbige nicht zum Rechnen brauchen.
"\1.\4"
\1 Damit haben wir Vorkommastellen,
. einen einheitlichen Punkt als Komma
\4 sowie die Nachkommastellen
Dieser String lässt sich nun problemlos in einen Float umwandeln zum rechnen.
Wenn wir nun schon so weit sind, können wir gleich noch weiter verbessern:
preg_replace('#([\d]+)((,|.)([\d]+))?.*#', '\1.\4', $string);
Double quotes hab ich durch single quotes ersetzt, dadurch braucht PHP den String nicht unnötig zu parsen und wir müssen im 'Replace'-Teil die Backreferenzen nicht doppelt escapen.
Dann ersetzen wir noch die Menge der 'Nicht-Zeichen' mit allen Zeichen, damit Einheiten wie z.B. m2 (Quadratmeter) durchkommen (Wer weiss in welch lustigen Formaten die Daten vorliegen mögen ;). Sobald das erste nicht-numerische Zeichen gefunden wird haben wir unsere Zahl, die wir zum Rechnen brauchen, eh schon zusammen, da spielt es keine Rolle ob in der Einheit noch weitere Zahlen auftauchen.
Gruss
Patrick
sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|