ERLEDIGT
NEIN
NEIN
ANTWORTEN
15
15
ZUGRIFFE
462
462
EMPFEHLEN
-
Hi,
folgendes Problem:
Ich hab einen String von einem IRC-Server, nehmen wir mal Folgenden:
Den möchte ich nun in dieses Format bringen:ERROR :Your host is trying to (re)connect too fast -- throttled
Code :1 2 3 4 5 6 7
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:
Das Ergebnis:PHP-Code:$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);
Code :1 2 3 4 5 6 7
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:
parsen kann ohne das sich die Indizes verändern wobei hier dann NOTICE im Index 1 steht und AUTH im Index 2.Code :1
NOTICE AUTH :*** Found your hostname
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ß - MarcelGeändert von extexo (12.09.09 um 19:47 Uhr)
-
12.09.09 21:56 #2
Gehts denn so:
?PHP-Code:$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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
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.
-
Sollte die ersten Zeichen bis zum : liefernCode :
1
^([^:]+)(:)(.+)
Dann :
Und denn restlichen Text danach
-
Leider auch nicht das was ich suche.
Das Ergebnis ist Folgendes:
Code :1 2 3 4 5 6 7
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:
Allerdings würd ich hier eher mit split() 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.Code :1
^(?:(\S+)\s+)?([^:\s]+)\s+:?(.*)$
Grüße, Matthias„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
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:
bzw.:Code :1 2 3 4 5 6 7
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 )
Mein Fehler !Code :1 2 3 4 5 6 7
Array ( [0] => NOTICE AUTH :*** Found your hostname [1] => NOTICE [2] => AUTH [3] => *** Found your hostname )
DankeGeändert von extexo (13.09.09 um 00:42 Uhr)
-
Ich verstehe den Ausdruck noch nicht ganz:
Ich verstehe den Ausdruck noch nicht ganz.Code :1
^(?:(\S+)\s+)?([^:\s]+)\s+:?(.*)$
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.Geändert von extexo (13.09.09 um 07:07 Uhr)
-
Hier hab ich Regex gelernt.
http://www.traum-projekt.com/forum/7...pressions.html
(und den Rest über msdn, weiß aber nicht inwieweit das PHP konform ist)
-
13.09.09 10:48 #10
Gerne als Link empfohlen : http://www.regex-tester.de/
Schöne Spielwiese und interessante Beispiele.
mfg chmeeMein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
Benutzt den DANKE-Knopf oder bewertet den Beitrag
"GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
-> Regexp <- -> php <- -> Javascript <-
-
Danke für die URLs nur wird dort leider nirgends diese Konstellation aus "Fragezeichen" erklärt 8D
Code :1
^(?:(\S+)\s+)?([^:\s]+)\s+:?(.*)$
-
Problem gelöst:
Resultat:Code :1
^(?:(\S+)\s*)(?:(\S*)\s*)(\S*):(.*)$
Wenn die Parameter leer sind bleiben die Indizies erhalten.PHP-Code: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
)
Das ?: steht offenbar dafür das die Klammer die es enthält nicht mit in die Ergebnisse genommen wird.
-
13.09.09 14:21 #13
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.Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
Benutzt den DANKE-Knopf oder bewertet den Beitrag
"GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
-> Regexp <- -> php <- -> Javascript <-
-
13.09.09 14:41 #14spanner Tutorials.de Gastzugang
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.
-
13.09.09 15:00 #15
*Asche auf mein Haupt* . Nur kannte ich Lookahead nicht mit :
mfg chmeeMein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
Benutzt den DANKE-Knopf oder bewertet den Beitrag
"GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
-> Regexp <- -> php <- -> Javascript <-
Ähnliche Themen
-
Mittels Regex Gültigkeit einer anderen Regex prüfen
Von blade runner im Forum PHPAntworten: 8Letzter Beitrag: 25.06.10, 12:07 -
Regex - Leere BB Tags
Von SkriptSuppe im Forum Coders TalkAntworten: 5Letzter Beitrag: 15.06.08, 17:30 -
REGEX Problem - Regex auf den gesamten String anwenden?
Von angelikamorgan im Forum JavaAntworten: 1Letzter Beitrag: 21.01.08, 16:58 -
[RegEx] Hilferuf eines RegEx-Desperados
Von ManicMarble im Forum Coders TalkAntworten: 15Letzter Beitrag: 16.06.05, 08:49 -
Parsing: RegEx mit '&', RegEx-Kenner gefragt
Von Kachelator im Forum PHPAntworten: 8Letzter Beitrag: 21.04.04, 09:16





Zitieren


Login






[PHP][Snippet] Array zu XML konvertieren