Leere Regex-Bedingung erzwingen

extexo

Mitglied
Hi,

folgendes Problem:

Ich hab einen String von einem IRC-Server, nehmen wir mal Folgenden:
ERROR :Your host is trying to (re)connect too fast -- throttled
Den möchte ich nun in dieses Format bringen:
Code:
Array
(
    [0] => ERROR :Your host is trying to (re)connect too fast -- throttled
    [1] => 
    [2] => ERROR
    [3] => Your host is trying to (re)connect too fast -- throttled
)

Das versuche ich mittels:
PHP:
$regx_src = '/(\S*)(\S+)\s+:(.*)/';
$row = 'ERROR :Your host is trying to (re)connect too fast -- throttled';
preg_match($regx_src, $row, $match)
print_r($match);

Das Ergebnis:
Code:
Array
(
    [0] => ERROR :Your host is trying to (re)connect too fast -- throttled
    [1] => ERRO
    [2] => R
    [3] => Your host is trying to (re)connect too fast -- throttled
)

Wie kann ich dafür sorgen das der Index 1 im Array bei diesem String auf jeden Fall
existiert ABER leer bleibt. Im Index 2 soll dann ERROR stehen.

Sinn ist der das ich auch Strings wie:
Code:
NOTICE AUTH :*** Found your hostname
parsen kann ohne das sich die Indizes verändern wobei hier dann NOTICE im Index 1 steht und AUTH im Index 2.

Ich muss auf jeden Fall irgendwie dafür sorgen das er erkennt das die erste Klammer nur angewant werden darf wenn kein Doppelpunkt danach folgt.
Wenn keiner folgt soll die Klammer dennoch zutreffen ABER ein leeres Ergebnis liefern sodass der Index 1 im Array dann eben leer ist.

Gruß - Marcel
 
Zuletzt bearbeitet:
Gehts denn so:
PHP:
$strRow = 'ERROR :Your host is trying to (re)connect too fast -- throttled';
$arrParts = explode(':', $strRow);
$arrReturn = array( $strRow, $arrParts[0], '', $arrParts[1]);

print_r($arrReturn);
?
 
Nein, das Ergebnis ist leider ein vollkommen Anderes:
Code:
Array
(
    [0] => ERROR :Your host is trying to (re)connect too fast -- throttled
    [1] => ERROR 
    [2] => 
    [3] => Your host is trying to (re)connect too fast -- throttled
)

Bzw.:

Array
(
    [0] => NOTICE AUTH :*** Found your hostname
    [1] => NOTICE AUTH 
    [2] => 
    [3] => *** Found your hostname
)

Außerdem wollt ich auf explode/split verzichten und Regex nutzen da das flexibler ist.

Aber trotzdem danke.
 
Leider auch nicht das was ich suche.
Das Ergebnis ist Folgendes:
Code:
Array
(
    [0] => ERROR :Your host is trying to (re)connect too fast -- throttled
    [1] => ERROR 
    [2] => :
    [3] => Your host is trying to (re)connect too fast -- throttled
)
 
Ich will es auch mal versuchen:
Code:
^(?:(\S+)\s+)?([^:\s]+)\s+:?(.*)$
Allerdings würd ich hier eher mit [phpf]split[/phpf] rangehen. Wenn du das IRC-Protokoll implementieren willst, verstehe ich dein Format aber eh nicht so ganz. Wieso sollte der Typ der Nachricht (ERROR bzw. NOTICE) an unterschiedlichen Stellen stehen? Abgesehen davon soll es auch Nachrichten mit mehr als zwei Parametern geben.

Grüße, Matthias
 
Dein Code macht fast das was ich gesucht habe.
Das ERROR soll natürlich wie auch das NOTICE bei einem Parameter,
im Index 1 stehen. Die möglichen Parameter sollen lediglich
im Array vorhanden sein. Also soll es so aussehen:
Code:
Array
(
    [0] => ERROR :Your host is trying to (re)connect too fast -- throttled
    [1] => ERROR
    [2] => 
    [3] => Your host is trying to (re)connect too fast -- throttled
)
bzw.:
Code:
Array
(
    [0] => NOTICE AUTH :*** Found your hostname
    [1] => NOTICE
    [2] => AUTH
    [3] => *** Found your hostname
)
Mein Fehler !

Danke
 
Zuletzt bearbeitet:
Ich verstehe den Ausdruck noch nicht ganz:
Code:
^(?:(\S+)\s+)?([^:\s]+)\s+:?(.*)$
Ich verstehe den Ausdruck noch nicht ganz.
Was bewirken die ?: , ? und :? ?
Das hab ich noch nicht verstanden, ich weiß nur,
laut http://www.regular-expressions.info das es einen Ausdruck
"faul" macht also nicht "gierig" oder eine IF-ELSE Anweisung einleitet
mittels (?ifthen|else)

Wär nett wenn du mir die Funktionsweise von deinem Code noch erklären könntest.
 
Zuletzt bearbeitet:
Zurück