ich möchte aus einem String wie zum Beispiel ",asd,22,123 kjhlasdh jkh as45 kljha sd" gerne alle Zahlen herausfiltern und in einem Array erhalten. Sprich am Ende sollten dann 22, 123 und 45 in einem Array stehen.
Dies sollte ja mit preg_split in PHP möglich sein. Nur finde ich die richtige Regular Expression nicht.
Liefert mir gerade als Ergebnis alle anderen Teile, die an den Zahlen getrennt wurden, aber wie kann ich einen RegEx negieren? Ich bräuchte ja "Trenne an allen Zeichen außer Zahlen".
Eigentlich müsste das Regex Pattern so aussehen: "[0-9]+" - alternativ geht auch die einfachere Version "\d+" die explizit alle Zahlen sucht - und Du ja auch keine Beschränkung hast.
Damit bekommst Du nur die Zahlen - egal was davor oder dahinter steht.
In dem Eingabestring ",asd,22,123 kjhlasdh jkh as45 kljha sd" werden die Einträge "22", "123" und "45" gefunden.
Das "+" bei "[0-9]+" ist notwendig, damit Du die volle Zahl findest. Ohne das Plus (also nur "[0-9]") werden ansonsten die Zahlen "2", "2", "1", "2", "3", "4", "5" gefunden - also jede Zahl allein.
Es kann sein, dass Deine zusätzliche PHP Logik auch schon spezielle Sachen filtert - bzw. ändert. Das kann ich aber nicht bewerten, da ich mich nicht in PHP auskenne.
Ich habe aber mal ein bisschen geschaut und dabei diesen Befehl gefunden:
"preg_match_all"
Hier ist der beschrieben - und er sollte eigentlich das machen, was Du möchtest.
Laut dem von mir geschickten Link sollte er aber eigentlich Regex machen - und keine fixen Zeichenketten - zumindest ist das Beispiel auf der Seite auf jeden Fall ein Regex Suchpattern.
Jo ... das hatte ich auch gedacht, aber ich habe es gerade ausprobiert und es geht nicht. Nuja, vielleicht habe ich noch irgendwas falsch gemacht ... mal sehen.
Hmm, im Grunde kann ich Dir nicht so wirklich weiterhelfen, hab aber trotzdem eine kleine Idee
Muss es effizient und elegant sein? Dann lies besser nicht weiter
Es gibt sicher eine Suchen-und-Ersetzen-Funkltion in php. Ersetze mit der alle Zeichen, die keine Zahl sind, durch Leerzeichen. Anschliessend ersetzt Du ein oder mehrere Leerzeichen in Folge durch ein einzelnes Komma. in Schritt drei teilst Du den ganzen String dann an den Kommas auf.
Definitiv nicht elegent, auch nicht effizient, aber koennte funktionieren
Danke, aber ein wenig effizient sollte es schon sein. Nein um ehrlich zu sein, sollte es sogar sehr effizient sein - ich überlege schon fast, ob ich mir den Aufwand mit den RegExs mache oder ob nicht ein einfaches explode an festen Zeichen genügt und man den Rest später abfängt.
andere Möglichkeit, durchlaufen den String von vorne nach hinten bis einer Zahl kommt, dann füge diese und alle folgenden Zahlen in array[x] bis keine zahl kommt. erhöhe x um eins und weiter von vorn.
vom speed her dürfte das schneller sein als der komplexe algo für die regulären ausdrücke etc. und man spart sich auch noch das anschließende explode.
Webmaster / Forumadmin [TweakPC Team] "It is far easier to concentrate power than to concentrate knowledge." Thomas Sowell
Wenn mein Arbeitskollege heute kommt, werde ich mich mal mit ihm kurzschließen. Der hat PHP auf seinem Rechner drauf, weil er momentan an nem PHP Webprojekt arbeitet. Der sollte sich recht gut auskennen, sodass wir Dein Problem mal schnell nachtstellen und testen können.
Die normalen "ereg" bzw. "eregi" Funktionen von PHP scheinen aber scheinbar ein Problem mit der Schreibweise "\d" zu haben - denn dann kommt nur Müll raus. Dort wird scheinbar nur die Schreibweise "[0-9]" bei Zahlen unterstützt - sah zumindest so aus. "preg_match_all" unterstützt aber laut unserem Test beide Schreibweisen.
Ah super, da fehlten dann die / ... was die nutzen, weiß ich zwar nicht, aber so funktionierts. Danke!!!
Die '/.../' dienen eigentlich dazu um den Regex String zu begrenzen. Dahinter kann man nämlich noch ein paar Regex Optionen setzen. Zum Beispiel '/.../i' um Groß- und Kleinschreibung zu ignorieren. '/.../g' müsste dafür sorgen, dass alle Treffer gefunden werden - also das PHP über die spezielle preg_match_all Funktion macht.
Die normalen \\"ereg\\" bzw. \\"eregi\\" Funktionen von PHP scheinen aber scheinbar ein Problem mit der Schreibweise \\"\d\\" zu haben - denn dann kommt nur Müll raus. Dort wird scheinbar nur die Schreibweise \\"[0-9]\\" bei Zahlen unterstützt - sah zumindest so aus. \\"preg_match_all\\" unterstützt aber laut unserem Test beide Schreibweisen.
Dazu kann ich was beisteuern ^^ Ich habe letzens festgestellt, dass
ereg und eregi nicht die gleiche Syntax benutzen wie preg_match.
preg_match benutzt die gängige Perl Syntax für Regexp, wogegen ereg eine eigene php spezielle hat oder so.
Ah super, da fehlten dann die / ... was die nutzen, weiß ich zwar nicht, aber so funktionierts. Danke!!!
Das "/" sind die Anfangs und Endkennung die in der Perl Syntax benutzt werden. Musst du dir mal Perl Regexp angucken genauso kann man da jedes andere zeichen benutzen.