Autor Beitrag
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Fr 11.05.07 16:21 
Hallo,

da ich mich mal wieder in php einüben wollte, mache ich momentan die Info-HAs alle mit php, anstatt mit Delphi.
Momentan geht es da um ein Simulation eines ASM-Modell.

Die Eingabe besteht aus mehreren Zeilen, wobei eine Zeile ein ASM-Code ist. Dem entsprechend sind die Parameter in der gleichen Zeile - und zwar durch Leerzeichen getrennt.

Das habe ich jetzt so weit in Arrays aufgetrennt.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
<?php
  function ExplodeASMCode($asm){
    //Zeilenumbruchsbehandlung
    $asm = str_replace(chr(13).chr(10), chr(13), $asm);
    $asm = str_replace(chr(10), chr(13), $asm);
    //String in Zeilenweises Array zerlegen
    $lines = explode(chr(13), $asm);
    //Zeilen bearbeiten
    for ($i = count($lines)-1; $i>-1; $i--){
      //Kommentare entfernen    
      $compos = strpos($lines[$i], '//');      
      if ($compos != 0) $lines[$i] = substr($lines[$i], 0, $compos);            
      $lines[$i] = trim($lines[$i]);
      //übrige in Array einteilen
      if ($lines[$i] != ''){
        $linepart[$i] = explode(' ', $lines[$i]);
        //alle Leerstellen entfernen
        reset($linepart[$i]);
        foreach ($linepart[$i] as $key => $val){          
          if ($val === ''){
            unset($linepart[$key]);
          }
        }
      }        
    }
    var_dump($linepart);
    return 0;
  }
?>


Allerdings hat der Code Probleme mit mehreren Leerzeichen. Also wenn z.B. zwischen dem ASM-Befehl und dem Arbeitsregister 2 Leerzeichen fürgt explode noch ein Leerstring ein. Diese wollte ich nun entfernen. Aber unset funktioniert dort nicht. Weiß einer von euch wieso?

PS: Falls einer eine bessere Variante für die Zeilenumbrüche hat, wäre ich dankbar.

Grüße
Heiko

//EDIT: Als ich mir hier den Quelli nachm abschicken noch einmal anguckte, viel mehr der Fehler auf... . Statt unset($linepart[$key]); muss es unset($linepart[$i][$key]); sein
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 11.05.07 16:38 
Du könntest statt explode auch preg_split verwenden:

ausblenden Quelltext
1:
$linepart[$i] = preg_split("/[ ]+/", $lines[$i]);					

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
blackbirdXXX

ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1077
Erhaltene Danke: 1

Ubuntu Dapper

BeitragVerfasst: Fr 11.05.07 16:56 
user profile iconHeiko hat folgendes geschrieben:
PS: Falls einer eine bessere Variante für die Zeilenumbrüche hat, wäre ich dankbar.


Wenn deine Newline Zeichen bereits auf \n normalisiert sind ist die schnellste Variante explode("\n", $s);. Ansonsten mach preg_split('/(?:\\r\\n|\\r|\\n)/', $s). Das akzeptiert dann Mac OS, UNIX und DOS Zeilenumbrüche.

_________________
Klein, schwarz und ärgert Techniker? Jumper!
Heiko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Fr 11.05.07 18:10 
Könnt ihr mir nur einmal kurz sagen, wie die / etc. zu interpretieren sind? Suchmasken liegen bei mir schon über ein JAhr zurück... .
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 11.05.07 18:15 
Das erste Zeichen eines regulären Ausdrucks gibt an, mit welchem Zeichen er beendet wird. In diesem Fall ist also alles zwischen den beiden "/" der reguläre Ausdruck. Nach dem letzten "/" können dann noch Modifier stehen, wie z.B. "i", falls das Ganze case-insensitiv sein soll.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Heiko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Sa 12.05.07 21:06 
Hallo Danke an euch beiden :).

So gefällt mir es schon besser:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
<?php
  function ExplodeASMCode($asm){        
    $asm = str_replace(chr(10), chr(13), $asm);
    //String in Zeilenweises Array zerlegen    
    $lines = preg_split('/\r\n|\r|\n/', $asm);
    
    //Zeilen bearbeiten
    for ($i = count($lines)-1; $i>-1; $i--){
      //Kommentare entfernen    
      $compos = strpos($lines[$i], '//');      
      if ($compos != 0) $lines[$i] = substr($lines[$i], 0, $compos);            
      $lines[$i] = trim($lines[$i]);
      //übrige in Array einteilen
      if ($lines[$i] != '') $linepart[] = preg_split("/[ ]+/", $lines[$i]);
    }
    var_dump($linepart);
    return 0;
  }
?>


@Blackbird: Welche Vrtoeile bringt die "Aufblähung" von preg_split('/(?:\\r\\n|\\r|\\n)/', $s), denn preg_split('/\r\n|\r|\n/', $asm) scheint das gleiche zu machen...
blackbirdXXX

ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1077
Erhaltene Danke: 1

Ubuntu Dapper

BeitragVerfasst: Sa 12.05.07 22:27 
user profile iconHeiko hat folgendes geschrieben:
@Blackbird: Welche Vrtoeile bringt die "Aufblähung" von preg_split('/(?:\\r\\n|\\r|\\n)/', $s), denn preg_split('/\r\n|\r|\n/', $asm) scheint das gleiche zu machen...


Tut es auch. Frag mich nicht warum ich jetzt eine anonyme Gruppe verwendet hab :D

_________________
Klein, schwarz und ärgert Techniker? Jumper!
Heiko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Di 15.05.07 10:39 
Hallo,

ich musste gerade feststellen, dass das mit preg_match doch nicht so funktioniert, wie es sollte. Sprich er hat Probleme mit dem Win-Zeilenumbruch. Wenn ein solcher kommt, trennt er zwar an der Stelle, macht jedoch eine Leerzeile dazu. Wenn ich "|\r|\n" entferne, also so, dass nur noch "\r\n" übrig bleibt, zerlegt er es gar nicht mehr :(. weiß einer von euch, woran es vlt. liegen könnt (@blackbird: bei deiner Variante passiert das gleiche ;) )?

//EDIT: Fehler gefunden. Lag am str_replace was ich ausversehen drin gelassen hatte.