tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
462
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    extexo extexo ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    23
    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 :
    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:
    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); 
    Das Ergebnis:
    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:
    Code :
    1
    
    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
    Geändert von extexo (12.09.09 um 19:47 Uhr)
     

  2. #2
    Avatar von tobee
    tobee tobee ist offline Grolba.com media
    Registriert seit
    Jul 2005
    Ort
    Karlsruhe
    Beiträge
    1.700
    Blog-Einträge
    131
    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); 
    ?
     

  3. #3
    extexo extexo ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    23
    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.
     

  4. #4
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Code :
    1
    
    ^([^:]+)(:)(.+)
    Sollte die ersten Zeichen bis zum : liefern
    Dann :
    Und denn restlichen Text danach
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  5. #5
    extexo extexo ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    23
    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
    )
     

  6. #6
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    Ich will es auch mal versuchen:
    Code :
    1
    
    ^(?:(\S+)\s+)?([^:\s]+)\s+:?(.*)$
    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.

    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

  7. #7
    extexo extexo ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    23
    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 :
    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
    )
    bzw.:
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    Array
    (
        [0] => NOTICE AUTH :*** Found your hostname
        [1] => NOTICE
        [2] => AUTH
        [3] => *** Found your hostname
    )
    Mein Fehler !

    Danke
    Geändert von extexo (13.09.09 um 00:42 Uhr)
     

  8. #8
    extexo extexo ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    23
    Ich verstehe den Ausdruck noch nicht ganz:
    Code :
    1
    
    ^(?:(\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.
    Geändert von extexo (13.09.09 um 07:07 Uhr)
     

  9. #9
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    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)
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  10. #10
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    Gerne als Link empfohlen : http://www.regex-tester.de/
    Schöne Spielwiese und interessante Beispiele.

    mfg chmee
     
    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 <-

  11. #11
    extexo extexo ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    23
    Danke für die URLs nur wird dort leider nirgends diese Konstellation aus "Fragezeichen" erklärt 8D
    Code :
    1
    
    ^(?:(\S+)\s+)?([^:\s]+)\s+:?(.*)$
     

  12. #12
    extexo extexo ist offline Mitglied
    Registriert seit
    May 2009
    Beiträge
    23
    Problem gelöst:
    Code :
    1
    
    ^(?:(\S+)\s*)(?:(\S*)\s*)(\S*):(.*)$
    Resultat:
    PHP-Code:
    TargetERROR 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.
     

  13. #13
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    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 <-

  14. #14
    spanner 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.
     

  15. #15
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    *Asche auf mein Haupt* . Nur kannte ich Lookahead nicht mit :

    mfg chmee
     
    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 <-

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 25.06.10, 12:07
  2. Regex - Leere BB Tags
    Von SkriptSuppe im Forum Coders Talk
    Antworten: 5
    Letzter Beitrag: 15.06.08, 17:30
  3. Antworten: 1
    Letzter Beitrag: 21.01.08, 16:58
  4. [RegEx] Hilferuf eines RegEx-Desperados
    Von ManicMarble im Forum Coders Talk
    Antworten: 15
    Letzter Beitrag: 16.06.05, 08:49
  5. Parsing: RegEx mit '&', RegEx-Kenner gefragt
    Von Kachelator im Forum PHP
    Antworten: 8
    Letzter Beitrag: 21.04.04, 09:16