PHP String in Buchtaben und Zahlen Splitten

Bububoomt

ohne Vertrauen
ID: 10361
L
28 April 2006
19.666
769
Ich möchte einen String in Buchstaben und Zahlen Splitten, wobei die Zahlen auch , separiert sein können durch ein Komma.

Also Beispiel:
a2 => Array([0]=>a,[1]=>2);
b50 => Array([0]=>b,[1]=>50);
d30,40 => Array([0]=>d,[1]=>30,40);
xyz2,7 => Array([0]=>xyz,[1]=>2,7);

sollte mit preg_split ja gehen, aber damit stehe ich auf Kriegsfuß :(
 
Nee, preg_split ist der falsche Weg, da hier ja Teilstrings mit identischem Aufbau gesucht werden, du willst ja eben in zwei verschiedene Teile zerlegen...
Das sollte mit einem preg_match funktionieren:

PHP:
$foo = preg_match('([a-zA-Z]+)([0-9,]+)', 'ab12,5', $bar);
(erster Teil 1 oder mehr Zeichen von A-Z oder a-z; Teil 2 1 oder mehr Zeichen 0-9 oder ,)
sollte dir eigentlich Folgendes liefern:
PHP:
$bar = [0] => 'ab12,5', [1] => 'ab', [2] => '12,5'
 
Kann doch nicht sein. :roll:

Sind alle Ziffern in $zahlen enthalten oder wo liegt das Problem?

Einen anderen Fehler kann ich mir nicht vorstellen...
 
Kann doch nicht sein. :roll:

Sind alle Ziffern in $zahlen enthalten oder wo liegt das Problem?

Einen anderen Fehler kann ich mir nicht vorstellen...

Nicht gerade ein Fehler, eher übers Ziel hinausgeschossen: Die Bemerkung "keine buchstaben im Anschluss" bedeutet vermutlich, daß nach der ersten Zahl (oder Ziffer? s.u.) keine Buchstaben mehr folgen. Dein Beispiel aus der Anleitung ("abc345thg41") liefert "abcthg" und "34541". Ist zwar richtig, kommt aber wohl nicht vor. Für diese Beispiel würde maracs Ausdruck nur ein unvollständiges Ergebnis ("abc" und "345") liefern.

Das Hantieren mit regulären Ausdrücken läßt sich mit isalpha() und substr() umgehen: solange zeichenweise prüfen bis "Kein Buchstabe" erkannt wird und an der Stelle teilen. Damit wären auch komplexere Zahlendarstellungen (zB -1.602e-19) ohne Mehraufwand zu erfassen. (Mist, doch noch Buchstaben...)
 
Das übliche Problem mit regulären Ausdrücken: Die einen verwenden sie immer und überall, auch wenn es im Einzelfall wenig sinnvoll ist, weil es deutlich performantere Wege gibt, die anderen scheuen sie wie der Teufel das Weihwasser und basteln sich irgendwelche Krücken drum herum, auch wenn der Problemfall sich mit regulären Ausdrücken deutlich einfacher und performanter lösen lässt...
Es gibt leider nicht viele Programmierer, die dieses Hilfsmittel da anwenden, wo es sinnvoll ist, und dort, wo es das nicht ist, andere Wege nutzen ;-)
In diesem Fall ist die Anwendung regulärer Ausdrücke meiner Ansicht nach der eleganteste Weg...
 
Also, genau ich meinte damit, das nach einer Zahl kein Buchstabe mehr kommt.

@marac
Wenn möglich und sinnvoll nutze ich es, nur ich bekomme es meist nicht so einfach hin. Brauche meist hilfe bei. Irgendwie komme ich damit noch nciht zu recht, nur mit wirklich einfachen sachen. Kann aber auch sein, weil ich einfach noch keine für mich ausreichende Anleitung gesehen habe (vor allem mit sehr vielen Beispielen).
 
Dann müsstest du die if Abfrage nur geringfügig ändern bzw. erweitern.

if (is_numeric($ziffer)) OR ($ziffer == ",") OR $ziffer == ".")
{
$zahlen=$zahlen .$ziffer;
$next=$i++;
if (!isset($string[$next])
{
break;
}
}
 
@marac: Ich wollte lediglich darauf hinweisen daß man bei deren Verwendung wissen muß WAS man sucht und WORIN man es sucht. Ein regulärer Ausdruck, der auch optionale Elemente (Vorzeichen, Nachkommastellen, Trennzeichen etc.) erfaßt, geht über eine einfache Trennung ("Buchstabe" oder "Ziffer/Komma"?) weit hinaus.
---
Wenn mit der Zahl nicht irgendwo weitergerechnet werden muß können mögliche Unterschiede bei der Zahlendarstellung und -umwandlung (*) ignoriert werden. Es bleibt dann bei der reinen Zerlegung einer Zeichenfolge in zwei Teilfolgen. Die Einschränkung "nach der Zahl kommt nichts mehr" vereinfacht die Suche weiter: vor dem ersten "gehört zu einer Zahl"-Zeichen trennen und fertig. Wie man dieses Zeichen findet ist aber egal.

(*) zB. länderspezifische Vorgaben: Ist das Komma in "123,456" ein Dezimal- oder Tausendertrennzeichen?
 
Nur so, das Komma ist ein Trennzeichen, damit ich dann wiederum zwei Zahlen habe... Also weder dezimal noch Tausenderstelle.