PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Regular Expressions]: Was mache ich falsch?


mf_2
2008-02-06, 18:46:10
Hallo,

Sorry wegen dem allgemein gehaltenen Threadtitel, aber es ging nicht besser zu beschreiben.
Folgendes:
Ich habe einen String in der Art:

[12:34] mf_2: Hallo Leute

Dieser wird anhand der folgenden Regular Expressions - Funktion in PHP zerlegt:

preg_match_all("/^\[([0-9]{2}):([0-9]{2})\](.*):(.*)/",$buffer,$gefundenes_wort)

Damit wird der String auch einwandfrei zerlegt, in:
$gefundenes_wort[1][0]=12
$gefundenes_wort[2][0]=34
$gefundenes_wort[3][0]=mf_2
$gefundenes_wort[4][0]=Hallo Leute

Allerdings scheitert die Funktion an so etwas:
[12:34] mf_2: Hallo Leute :-)

Da wird das ganze in so etwas zerlegt:
$gefundenes_wort[1][0]=12
$gefundenes_wort[2][0]=34
$gefundenes_wort[3][0]=mf_2: Hallo Leute
$gefundenes_wort[4][0]=-)

Ich habe dann einmal das Ende-Zeichen an den regulären Ausdruck angehängt:

preg_match_all("/^\[([0-9]{2}):([0-9]{2})\](.*):(.*)$/",$buffer,$gefundenes_wort)

Leider hat sich überhaupt nichts geändert. Alles nach dem 'mf_2:' soll in EIN Feld gespeichert werden. Wieso funktioniert das nicht? Könnt ihr mir da weiterhelfen?

Gruß,
mf_2

Trap
2008-02-06, 19:00:51
Für regexp ist allgemein http://weitz.de/regex-coach/ sehr hilfreich. Das ist ein Programm in dem man alles interaktiv angucken und ausprobieren kann.

Gast
2008-02-06, 20:07:45
Das Problem dürfte sein, dass der erste Ausdruck "greedy" matcht, also probiert einen möglichst langen String zu matchen der diesem Ausdruck entspricht. Deswegen holt er sich das zweite : . (ist aber schwer zu sagen, da in deinem String leider Smileys sind. ;) )

Ich weiß zwar nicht, wie es bei PHP ist, aber meistens kann man mit einem ? hinter dem * (bzw. auch +) den Ausdruck non-greedy machen, das sollte funktionieren.

Sephiroth
2008-02-06, 20:29:17
"/^\[([0-9]{2}):([0-9]{2})\]([^:]+):(.*)/"
matcht jetzt alle Zeichen, die kein Doppelpunkt sind, und es soll mind. ein Zeichen vor dem Doppelpunkt stehen (erwartungsgemäß)
Steht bei der Gruppierung [] das ^ als erstes, hat es die Bedeutung eines Negators.