Problem mit Regex

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit Regex

    Hi.

    Ich arbeite z.Zt. an einem Parser, der folgenden String auslesen und in lesbar abspeichern soll:

    Military Scan on 13:6:5 in tick 209
    Ship Base Fleet 1 Fleet2 Fleet3
    Phantom 1000 1000 2000 0
    Apparition 0 200 0 0
    Banshee 0 0 0 1000
    Spirit 0 0 500 0
    Wraith 0 500 0 0
    Shadow 0 0 0 0
    Nightmare 0 0 0 0
    Ghost 0 0 0 0
    Spectre 0 0 0 0
    Illusion 0 0 500 0
    Vampyre 0 0 0 0
    Haunt 0 0 0 0

    PHP-Code:
    elseif (substr($parser[$n], 016) == 'Military Scan on') {
        
        
    $type "12Military Scan";
        
    $word explode(" "$parser[$n]);
        
    $coords explode(":"$word[3]);
        
    $x $coords[0]; $y $coords[1]; $z $coords[2]; $tick $word[6];
        if (
    $hide) { $text .= "<table><tr><th colspan='5'>Military Scan on X:X:X in tick $tick</th></tr>"; }
      else { 
    $text .= "<table><tr><th colspan='5'>Military Scan on $x:$y:$z in tick $tick</th></tr>"; }
      
      
    $text .= "<tr><td>Ship</td><td>Base</td><td>Fleet 1</td><td>Fleet 2</td><td>Fleet 3</td></tr>";
        
      
    $regex "^([a-zA-Z]+(\s+[a-zA-Z]+)*)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)^";
      
    preg_match_all($regex$parser2$treffer);

      for(
    $i=0;$i<sizeof($treffer);$i++)
        {
            
    $name $treffer[1][$i];
            
    $base $treffer[3][$i];
            
    $f1 $treffer[4][$i];
            
    $f2 $treffer[5][$i];
            
    $f3 $treffer[6][$i];
                    
            
    $text .= "<tr><td>$name</td><td>$base</td><td>$f1</td><td>$f2</td><td>$f3</td></tr>";
        }
        
    $text .= "</table>";

    Das Problem: Egal wie der String aussieht, preg_match_all findet immer nur 7 Treffer. In diesem Fall ist der letzte Treffer die Zeile welche mit Nightmare startet. Am Pattern dürfte es nicht liegen, da er die 7 Zeilen davor ja findet. Hat jemand eine Idee?

    Danke im vorraus.
    rampage
    Zuletzt geändert von rampage; 16.10.2006, 21:59.

  • #2
    hm.. ich kann mich irren aber du kannst ^ glaub nicht als Delimiter genutzt werden.. benutz lieber & oder ! oder # oder sonst was

    MfG

    Kommentar


    • #3
      Das ist noch ein Überbleibsel aus einem Versuch. Ich habe bereits mehrere Delimiter ausprobiert aber egal ob # oder /. Nichts hat funktioniert.

      Kommentar


      • #4
        du könntest deinen code mal in [php]-tags setzen.

        >preg_match_all($regex, $parser2, $treffer);
        was ist der inhalt von $parser2?

        Kommentar


        • #5
          Der Inhalt von $parser2 ist der String über dem Code:

          Military Scan on 13:6:5 in tick 209
          Ship Base Fleet 1 Fleet2 Fleet3
          Phantom 1000 1000 2000 0
          Apparition 0 200 0 0
          Banshee 0 0 0 1000
          Spirit 0 0 500 0
          Wraith 0 500 0 0
          Shadow 0 0 0 0
          Nightmare 0 0 0 0
          Ghost 0 0 0 0
          Spectre 0 0 0 0
          Illusion 0 0 500 0
          Vampyre 0 0 0 0
          Haunt 0 0 0 0

          Kommentar


          • #6
            achso.

            naja, normales verhalten von preg_match_all

            index 0 ist das komplette suchmuster, index 1 die erste klammer, ... usw.
            du hast sechs klammernpaare also liefert die die funktion ein array mit 7 einträgen.

            aber wie es aussieht, hast du immer vier attribute und die einträge sind durch new-lines getrennt - ein geschachteltes explode tut es da ja auch.

            Kommentar


            • #7
              Ich weiß. Aber ich glaube Du vertauschst hier gerade die beiden Arrays. Die Anzahl der Treffer ist die Laufvariable $i, [1] = Name, [2] wäre die wiederholte Verbindung von 2 auftretenden Buchstabenstrings (unnötige deswegen kein [2][$i], [3] ist die erste Zahl, [4] die zweite Zahl, [5] die dritte Zahl und [6] die vierte Zahl.

              Deswegen liefert sizeof() für $treffer auch immer max. 7 als Ergebnis.

              Das Skript macht genau das was es soll, nur hört es bei mehr als 7 Zeilen auch nach diesen 7 Zeilen auf.

              Kommentar


              • #8
                Original geschrieben von rampage
                Das Skript macht genau das was es soll, nur hört es bei mehr als 7 Zeilen auch nach diesen 7 Zeilen auf.
                wenn das mal kein widerspruch ist

                ich glaube, ich weiß, worauf du hinaus möchtest.
                mach mal print_r($treffer).

                also count($treffer[0]) - ist ein mulidimensionales array.

                ps: sizeof ist ein alias für count.

                Kommentar

                Lädt...
                X