Eric: String aufteilen

Hi,

Ich möchte einen beliebigen String in zwei Teile aufsplitten. Der String ist dabei grundsätzlich gleich aufgebaut: zuerst Buchstaben, danach Zahlen, z.B.

dhgz15
dq122
prs77

Nun möchte ich letztendlich 2 Strings haben: den Buchstaben-Teil und den Ziffern-Teil.

Meine erste Idee wäre gewesen, das per strstr() zu lösen, doch erstens bekomm ich so ein Zeichen zu wenig (wenn ich nach dem ersten Vorkommen einer Ziffer suche), außerdem wüsste ich nicht, wie ich das anstellen sollte. Bitweise Operatoren vielleicht? Habe bereits danach gegoogelt aber nichts brauchbares gefunden.

Danke im Voraus für Beiträge.

  1. Hallo,

    RegularExpression:

    ^([A-Za-z])*([0-9])*$

    $str1 = //1;
    $str2 = //2;

    Viele Grüße

    --
    Mit zunehmendem Fortschritt der Zeit ist mit proportional ansteigendem Lebensalter zu rechnen.
    Selfcode: ie:( fl:| br:^ va:| ls:[ fo:) rl:( n4:| ss:| de:[ js:| ch:? sh:( mo:) zu:|
    1. RegularExpression:

      ^([A-Za-z])*([0-9])*$

      $str1 = //1;
      $str2 = //2;

      Ah ja genau das habe ich gemeint aber wie genau wende ich das an?

      Danke schonmal! Nur fehlt jetzt der letzte Schritt :)

      1. Hallo,

        Ah ja genau das habe ich gemeint aber wie genau wende ich das an?

        http://www.selfphp.de/funktionsuebersicht/regulaere_ausdruecke_posix.php
        Die Funktionen ereg() und eregi() werden für reguläre Ausdrücke verwendet.

        All das nützt dir aber wenig, wenn du mit der Syntax von regulären Ausdrücken nicht vertraut bist.

        Viele Grüße

        --
        Angeblich macht zuviel Sex blöd und gleichgültig. Hab keine Ahnung davon und ist mir auch egal.
        Selfcode: ie:( fl:| br:^ va:| ls:[ fo:) rl:( n4:| ss:| de:[ js:| ch:? sh:( mo:) zu:|
        1. All das nützt dir aber wenig, wenn du mit der Syntax von regulären Ausdrücken nicht vertraut bist.

          Dann versuche ich das mal zu ändern, danke für den Link :)

          1. Hallo nochmal,

            habe jetzt eine Möglichkeit gefunden, glaube allerdings, dass das auch eleganter funktioniert ... kann mir vielleicht jemand eine bessere / effektivere Version abieten? Werde auch mal nach einer Erläuterung zu den Regular Expressions suchen aber wenn jemand einen passenden Link parat hat, nehm ich den gern entgegen :)

              
            $str = "helloaduda124";  
            ereg("^([A-Za-z])*", $str,$regs);  
            $name = $regs[0];  
            ereg("^([A-Za-z])*([0-9])*", $str,$regs);  
            $value = substr(strrchr($str, $regs[1]),1);  
            
            

            Grüße,

            Eric

            1. Hallo Eric.

              Werde auch mal nach einer Erläuterung zu den Regular Expressions suchen aber wenn jemand einen passenden Link parat hat, nehm ich den gern entgegen :)

              Dich könnte der PCRE-Evaluator interessieren.

              Einen schönen Sonntag noch.

              Gruß, Ashura

              --
              sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
              „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
              [HTML Design Constraints: Logical Markup]
            2. gudn tach!

              Werde auch mal nach einer Erläuterung zu den Regular Expressions suchen aber wenn jemand einen passenden Link parat hat, nehm ich den gern entgegen :)

              viele links findest du im wikipedia-artikel zu regulaeren ausdruecken, unten.

              posix-kompatible regulaere ausdruecke sind geschmackssache. den meisten leuten schmecken sie nicht. (nicht nur) in php sind die perl-kompatiblen (pcre) meist schneller.

              selfhtml-erklaerung zu regulaeren ausdruecken in perl
              perldoc perlre (perl manual, ausfuehrlicher)
              php-manual zu pcre

              $str = "helloaduda124";  
              [link:http://de2.php.net/manual/en/function.preg-match.php@title=preg_match]('/^([A-Za-z]*)(\d*)$/', $str, $res);  
              $name = $regs[0];  
              $value = $regs[1];
              

              prost
              seth

              1. $str = "helloaduda124";

                [link:http://de2.php.net/manual/en/function.preg-match.php@title=preg_match]('/^([A-Za-z])(\d)$/', $str, $res);
                $name = $regs[0];
                $value = $regs[1];

                  
                Hallo,  
                  
                danke für die "Auflösung", hatte nun nach einigen weiteren Suchen ein ähnliches Ergebnis. Werde mir die Links in nächster Zeit mal vornehmen, um sicherer auf dem Gebiet zu werden.  
                  
                Vielen Dank nochmals an alle.  
                  
                Grüße,  
                  
                Eric  
                
                
        2. Hallo Richard.

          http://www.selfphp.de/funktionsuebersicht/regulaere_ausdruecke_posix.php
          Die Funktionen ereg() und eregi() werden für reguläre Ausdrücke verwendet.

          Sollten sie aber nicht mehr. Die PCRE-basierten Funktionen sollten an Stelle dessen genutzt werden.

          Einen schönen Sonntag noch.

          Gruß, Ashura

          --
          sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
          „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
          [HTML Design Constraints: Logical Markup]
  2. Hi!

    Ich weiß nicht ob das funktioniert was ich jetzt schreibe,
    aber das ist mir in den Kopf gekommen als ich deine Frage
    so gelesen habe...

    Versuch doch einfach jede einzelne Stelle
    anzuschauen, in den ASCII Code umzuwandeln und
    da ja alle kleinbuchstaben im bereich von 97 bis 122 liegen
    und alle Zahlen im Bereich von 48 bis 57 kannst du ja schonmal
    festlegen ab wann der zahlen bereich anfängt...

    Hoffe ich konnte damit weiterhelfen, aber wie gesagt
    hab es selbst noch nie gemacht...

    Gruß,
           Phil

  3. Hallo,

    Nun möchte ich letztendlich 2 Strings haben: den Buchstaben-Teil und den Ziffern-Teil.

    Das allereinfachste ist (wenn auch nicht "beste") ist, den String einfach Zeichen für Zeichen zu überprüfen:

      
    <?php  
    $buchstaben = Array();  
    $zahlen = Array();  
    $str ="aaa111";  
    $str_array = str_split($str);  
    foreach($str_array as $char){  
       is(is_numeric($char)){  
          $zahlen[] = $char;  
       }else{  
          $buchstaben[] = $char;  
       }  
    }  
      
    ?>  
    
    

    (aus dem Kopf, ich hoffe es haut hin :))

    Gruß,
    Severin

    --
    They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
    -- Benjamin Franklin
    1. Hallo,

      is(is_numeric($char)){

      muss natürlich if(is_numeric($char)){heissen.

      Gruß,
      Severin

      --
      They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
      -- Benjamin Franklin
      1. Hallo Severin Kacianka,

        danke für deine Antwort. Werde diese Variante benutzen, falls kein anderer Vorschlag bekommt, doch ist es nicht das, was ich wollte.

        Grüße,

        Eric

  4. Hi Eric,

    Ich möchte einen beliebigen String in zwei Teile aufsplitten. Der String ist dabei grundsätzlich gleich aufgebaut: zuerst Buchstaben, danach Zahlen, z.B.

    dhgz15
    dq122
    prs77

    Nun möchte ich letztendlich 2 Strings haben: den Buchstaben-Teil und den Ziffern-Teil.

    Um wirklich alle Buchstaben abzudecken, würde ich folgendes vorschlagen:

      
    $vorher = 'blubbä123';  
    if( !preg_match('/\A([[:alpha:]]+)(\d+)\Z/', $vorher, $nachher) ) {  
      print('String entsprach nicht den Vorgaben!');  
      exit();  
    }  
    $buchstaben = $nachher[1];  
    $zahlen = $nachher[2];  
      
    // zur Anschauung  
    print_r($nachher);  
    
    

    Das Array $nachher beinhaltet dann die Teilstrings in den zur Nummer der Klammer passenden Keys. Und $nachher[0] enthält den gesamten gefundenen String.

    Die "regular expression" aufgedröselt:

    [:alpha:] Zeichenklasse für alle Buchstaben (nicht nur a-z und A-Z);
    [[:alpha:]] Zeichen aus obiger Zeichenklasse mindestens einmal;
    \d+ Zahl ("\d") mindestens einmal ("+");
    \A String-Anfang;
    \Z String-Ende;

    Irgendwo auf pcre.org steht das auch ausführlichst erläutert.

    MffG
    EisFuX

    --
    ... Suchmaschinen-Blog ...
    1. Mist! Das "+" vergessen:

      Statt:

      [[:alpha:]] Zeichen aus obiger Zeichenklasse mindestens einmal;

      ... sollte es heißen:
      [[:alpha:]]+ Zeichen aus obiger Zeichenklasse mindestens einmal;