"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

problem mit folgender regexp

tomstig 30.01.2005 - 17:47 693 13
Posts

tomstig

OC Addicted
Avatar
Registered: Nov 2003
Location: /home/tomstig/
Posts: 1341
ich bastel grade an einem tool, das mir spieler in einem onlinegame-ranking vergleicht.

ich poste mal ein beispiel, wie das ausschaut:
Zitat
1196 Hell Fire death 2586 0 7
1269 Realitycop agga 2469 -15522 5
so, jetzt hab ich soweit programmiert, dass er in ein array schreibt, welcher platz der spieler ist, wieviel ruhm uswusf.

realisiert hab ich das ganze, indem ich die abstände durch | ersetzt habe und dann mit explode("|",$blabla) die einzelnen teil voneinander getrennt habe.

doch hier taucht ein problem auf: wie man sieht, hat der spieler hell fire schon ein abstand im namen, sprich, auch er wird geteilt und dann falsch woanders eingetragen. das will ich verhindern und hab es mit folgender regexp versucht:
Code: PHP
if(preg_match("/^[0-9]{1,5} ([a-z]+ ){3} .+$/i", $linevalue))
        echo "Der Name besteht aus 2 Teilen";

# linevalue = 1196 Hell Fire death 2586 0 7 

das ist jetzt keine replace (in späterer folge soll das eins werden). hier will ich nur prüfen ob das geht.

der preg_match befehl lautet aus meiner sicht wie folgt:
zuerst kommen 1-5 zahlen zwischen 0-9 (=rang), dann kommen 3x mehrere buchstaben mit einem abstand danach (name, gott; es soll geschaut werden, ob das 3x geht, weil wenn es 3x geht, dann würde das heißen, dass der spielername aus 2 teilen besteht...) und danach verschieden zeichen (.+ = ruhm, höhlen, punkte)

aber er schreibt mir bei keinem spieler "Der Name besteht..." hin. wieso? was mach ich falsch?

tia, mfg
Bearbeitet von tomstig am 30.01.2005, 17:50

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
nene, also da hast nen hund drinnen, das geht so net...
Du musst das matchen, was du als fix ansehen kannst - und das dazwischen kann dann eh nurmehr der name sein:
"/^([0-9]+) (.*?) ([0-9]+) (-?[0-9]+) ([0-9]+)/"

damit hast du die infos die du willst dann sogar schön verpackt im array ;)

alternativ dazu könntest du auch einfach so wie jetzt per explode den string zerteilen. das erste element wegnehmen und die letzten 3 - das was überbleibt ist dein Name, den kannst du dann wieder imploden, fertig. Ich finde das aber nicht so "sauber" ;)

tomstig

OC Addicted
Avatar
Registered: Nov 2003
Location: /home/tomstig/
Posts: 1341
Zitat von watchout
nene, also da hast nen hund drinnen, das geht so net...
Du musst das matchen, was du als fix ansehen kannst - und das dazwischen kann dann eh nurmehr der name sein:
"/^([0-9]+) (.*?) ([0-9]+) (-?[0-9]+) ([0-9]+)/"

damit hast du die infos die du willst dann sogar schön verpackt im array ;)

alternativ dazu könntest du auch einfach so wie jetzt per explode den string zerteilen. das erste element wegnehmen und die letzten 3 - das was überbleibt ist dein Name, den kannst du dann wieder imploden, fertig. Ich finde das aber nicht so "sauber" ;)

vom programmieren her ist alles schon fertig, es tauchte nur der bug auf, wenn ein spieler name aus 2 teilen bestand. falls ein name aus 2 teilen besteht, hätte ich ihn mit einem punkt oder mit einem unterstrich verbunden und bei der ausgabe wieder zurückgeändert.

so, zu deiner variante:
also die 2te klammer, auf die es eigentlich ankommt, stimmt in der form nicht. du fragst einfach nur ab, ob der string richtig ist (.*?) und nicht, ob der name aus 2 teilen besteht. weil wie gesagt, würde er aus 2 teilen bestehen, dann müsste es 3x buchstaben geben.

wie kann ich das abfragen?

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
scheinbar verstehst du nicht, wie reguläre ausdrücke funktionieren:
ein regulärer ausdruck fragt nicht ab, sondern er "matched", dh. es wird überprüft, ob die vorlage (der pattern) passt.

deshalb wäre es auch komplett sinnlos eine regexp in einem derart kurzen string nur dazu zu verwenden, zu überprüfen ob der name 2-teilig ist.
Die Regexp von mir sollte im "matches" array alle deine werte zurückliefern die du brauchst, egal ob der name ein, zwei, oder 4000 leerzeichen enthält.
deswegen brauchst du damit auch keinen explode, oder sonstwas mehr - das macht die preg_-funktion schon.

tomstig

OC Addicted
Avatar
Registered: Nov 2003
Location: /home/tomstig/
Posts: 1341
aha, ich hab deine idee langsam verstanden. nur die durchführung nicht: welches preg? preg_replace? wie müssten dann die parameter ausschauen, damit die einzelnen teile in ein array aufgeteilt werden?

ja, ich weiß, "kann regexp erst seit gestern" ist keine ausrede, aber wäre super, wenn du mir deine idee fertig präsentieren könntest :up: (wenn du zeit hast)

tia, mfg

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4282

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von kleinerChemiker
http://at.php.net/manual/de/function.ereg.php
oh, ja - alternativ kannst auch gleich eine endlosschleife einbauen, um die performance zu verbraten...

natürlich preg_match(). bei diesem gibt es einen optionalen parameter, der "matches" o.ä. heisst. Wenn du diesem eine existierende variable übergibst, dann schreibt preg_match alle matches als array rein - wobei jede Klammer ein Element im Array ist, und der gesamte match im Element "0" ist.

Edit: Selber lesen bringt dich aber auch weiter... :rolleyes:
http://cz.php.net/manual/en/function.preg-match.php
Bearbeitet von watchout am 31.01.2005, 13:57

tomstig

OC Addicted
Avatar
Registered: Nov 2003
Location: /home/tomstig/
Posts: 1341
Zitat von kleinerChemiker
http://at.php.net/manual/de/function.ereg.php

wieso kann ich leute wie dich nicht leiden?
"kann regexp erst seit gestern" -> sagt das nicht eh alles? und glaubst du ich kenn die befehle nicht? es ging mir rein um den regexp :rolleyes: :bash:

Zitat
Edit: Selber lesen bringt dich aber auch weiter...
http://cz.php.net/manual/en/function.preg-match.php

same here...
und auf deutsch isses mir lieber...


und im endeffekt hab ich eine einfachere lösung gefunden... trotzdem danke...

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4282
Zitat von tomstig
wieso kann ich leute wie dich nicht leiden?

vielleicht weil du zu faul zum lesen bist? die regexp steht weiter oben, und da steht eine funktion, in die du die regexp einsetzen kannst.

"kann regexp erst seit gestern" -> sagt das nicht eh alles? und glaubst du ich kenn die befehle nicht? es ging mir rein um den regexp :rolleyes: :bash:

warum fragst du dann welches preg?

@watchout: was kann eigentlich ereg mehr als preg_match? oder warum ist es resourcenlastiger? im manual finde ich nix, das ereg "besser" macht.

tomstig

OC Addicted
Avatar
Registered: Nov 2003
Location: /home/tomstig/
Posts: 1341
http://at2.php.net/manual/de/function.ereg-replace.php

ist zwar gut versteckt, ist aber IMHO für alle ereg<>preg gültig...

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4282
meinstu du damit den tip?
(Tipp: Die Funktion preg_replace(), die eine zu Perl kompatible Syntax regulärer Ausdrücke verwendet, ist häufig die schnellere Alternative zu ereg_replace().)

Ehrlich gesagt, den hab ich bei anderen auch gelesen, aber verstehe nicht so ganz, was er mir sagen will, außer daß preg schneller ist.:confused: :confused:

SYSMATRIX

Legend
Legend
Registered: May 2000
Location: ~
Posts: 5020
du hast eh schöne word boundaries, warum verwendest du nicht split für sowas?

funka

Legend
ex-prophet(down below)
Registered: Sep 2000
Location: Vienna / SF
Posts: 6131
oder gleich explode wie watch oben empfohlen hat
erspart man sich den ganzen regex umweg

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von kleinerChemiker
@watchout: was kann eigentlich ereg mehr als preg_match? oder warum ist es resourcenlastiger? im manual finde ich nix, das ereg "besser" macht.
eben. Es ist nämlich schlicht und ergreifend sowohl in Sachen Performance, als auch bei den Features schlechter.

Edit: @tomstig: Ich habe dir jetzt 2 verschiedene Möglichkeiten ausführlich erklärt. Mit Links sogar (Auf das "auf deutsch is mir lieber" will ich garnicht weiter eingehen...:rolleyes:). Mehr Hilfe ist garnicht mehr möglich. Oder willst dass ich dir das Programm auch noch schreibe? Scheinbar war ich wieder einmal zu gutmütig, es ist erstaunlich wie schnell man eines Besseren belehrt wird...
Bearbeitet von watchout am 01.02.2005, 17:41
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz