Computer Hardware Forum - TweakPC

Computer Hardware Forum - TweakPC (https://www.tweakpc.de/forum/)
-   Programmiersprachen (https://www.tweakpc.de/forum/programmiersprachen/)
-   -   Regular Expression: Alles außer Zahlen (https://www.tweakpc.de/forum/programmiersprachen/59645-regular-expression-alles-ausser-zahlen.html)

Fabian 09.09.2008 10:04

Regular Expression: Alles außer Zahlen
 
Hallo,

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.

preg_split("([0-9])",$string, -1, PREG_SPLIT_NO_EMPTY);

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".

Danke schonmal ...

Exit 09.09.2008 16:55

AW: Regular Expression: Alles 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.

[URL="http://www.php.net/manual/de/function.preg-match-all.php"]PHP: preg_match_all - Manual[/URL]

Fabian 09.09.2008 21:35

AW: Regular Expression: Alles außer Zahlen
 
Hi, erstmal vielen Dank!

preg_match_all hilft nur leider nicht, weil er nach einer fixen Zeichenkette und keiner RegEx sucht - zumindest so wie ich es zur Zeit verwende.

Exit 09.09.2008 21:42

AW: Regular Expression: Alles außer Zahlen
 
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.

Fabian 09.09.2008 21:44

AW: Regular Expression: Alles außer Zahlen
 
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.

kerri 09.09.2008 21:56

AW: Regular Expression: Alles außer Zahlen
 
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 ;)

Gruesslies, Kerri

Fabian 09.09.2008 22:03

AW: Regular Expression: Alles außer Zahlen
 
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.

Robert 09.09.2008 23:27

AW: Regular Expression: Alles außer Zahlen
 
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.

Exit 10.09.2008 07:57

AW: Regular Expression: Alles außer Zahlen
 
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.

Exit 10.09.2008 08:26

AW: Regular Expression: Alles außer Zahlen
 
So getestet und funktioniert:

[code]$v = \",asd,22,123 kjhlasdh jkh as45 kljha sd\";

preg_match_all('/\d+/', $v, $reg);
var_dump($reg);[/code]

Alternativ geht auch:


[code]preg_match_all('/[0-9]+/', $v, $reg);[/code]

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.

Fabian 10.09.2008 10:15

AW: Regular Expression: Alles außer Zahlen
 
Ah super, da fehlten dann die / ... was die nutzen, weiß ich zwar nicht, aber so funktionierts. Danke!!!

Exit 10.09.2008 12:05

AW: Regular Expression: Alles außer Zahlen
 
[quote=Fabian;571180]Ah super, da fehlten dann die / ... was die nutzen, weiß ich zwar nicht, aber so funktionierts. Danke!!![/quote]

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[B]_all[/B] Funktion macht.

Kannst ja auch mal hier rein schauen: [url=http://de.selfhtml.org/navigation/suche/index.htm?Suchanfrage=regex]SELFHTML: Navigationshilfen / Suche[/url]

Da sind unter "Syntax regulärere Ausdrücke" die Schalter '/i' und '/g' beschrieben - bzw. geht natürlich auch '/gi'.

Robert 10.09.2008 15:21

AW: Regular Expression: Alles außer Zahlen
 
[quote=Exit;571158]So getestet und funktioniert:

[code]$v = \\\",asd,22,123 kjhlasdh jkh as45 kljha sd\\\";

preg_match_all('/\d+/', $v, $reg);
var_dump($reg);[/code]Alternativ geht auch:


[code]preg_match_all('/[0-9]+/', $v, $reg);[/code]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.[/quote]

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.

preg_match soll auch schneller sein!

Robert 10.09.2008 15:23

AW: Regular Expression: Alles außer Zahlen
 
[quote=Fabian;571180]Ah super, da fehlten dann die / ... was die nutzen, weiß ich zwar nicht, aber so funktionierts. Danke!!![/quote]

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 Uhr.

Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.