Leere Regex-Bedingung erzwingen

Danke für die URLs nur wird dort leider nirgends diese Konstellation aus "Fragezeichen" erklärt 8D
Code:
^(?:(\S+)\s+)?([^:\s]+)\s+:?(.*)$
 
Problem gelöst:
Code:
^(?:(\S+)\s*)(?:(\S*)\s*)(\S*):(.*)$
Resultat:
PHP:
Target: ERROR param1 param2:Your host is trying to (re)connect too fast -- throttled

Array
(
    [0] => ERROR param1 param2:Your host is trying to (re)connect too fast -- throttled
    [1] => ERROR
    [2] => param1
    [3] => param2
    [4] => Your host is trying to (re)connect too fast -- throttled
)
Wenn die Parameter leer sind bleiben die Indizies erhalten.
Das ?: steht offenbar dafür das die Klammer die es enthält nicht mit in die Ergebnisse genommen wird.
 
Naja, mutmaßen brauchst Du nicht. ^ steht für NICHT, und ? steht für kein oder ein Zeichen, im Gegensatz zu * (kein oder 1/mehrere Zeichen). Das : ist als : zu werten, hat keine Funktion.

Das Pattern wollte ich nicht lesen, die Syntax ist aber auf jeder besseren Seite (wie Wiki) verständlich lesbar.
 
Naja, er hat da eigentlich recht vermutet :-(

Das ^steht in dem Fall für den Beginn der Zeichenkette, und das (?: leitet eine sogenannte Non-capturing Group, ein Lookahead, ohne eine Referenz zu Erzeugen.
 
Zurück