tomstig
OC Addicted
|
ich bastel grade an einem tool, das mir spieler in einem onlinegame-ranking vergleicht. ich poste mal ein beispiel, wie das ausschaut: 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: 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
Legendundead
|
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
|
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
Legendundead
|
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
|
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
|
|
watchout
Legendundead
|
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... http://cz.php.net/manual/en/function.preg-match.php
Bearbeitet von watchout am 31.01.2005, 13:57
|
tomstig
OC Addicted
|
|
kleinerChemiker
Here to stay
|
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
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
|
|
kleinerChemiker
Here to stay
|
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.
|
SYSMATRIX
Legend Legend
|
du hast eh schöne word boundaries, warum verwendest du nicht split für sowas?
|
funka
Legend ex-prophet(down below)
|
oder gleich explode wie watch oben empfohlen hat erspart man sich den ganzen regex umweg
|
watchout
Legendundead
|
@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... ). 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
|