Sven: alles ersetzen, was keine Zahlen sind

Hi

ich möchte aus ein String alles in ein Komma ersetzen, was keine Zahlen sind.
Welche Möglichkeiten habe ich da?

Sven

  1. Hi

    ich möchte aus ein String alles in ein Komma ersetzen, was keine Zahlen sind.
    Welche Möglichkeiten habe ich da?

    Sven

    Hi,

    dazu benutzt man am besten einen regulären Ausdruck zusammen mit der Funktion preg_replace();

    Das Ganze sieht dann so aus:
    $string = preg_replace('/\D/', ',', $string);

    MfG
    Blizz

    1. Hi

      dazu benutzt man am besten einen regulären Ausdruck zusammen mit der Funktion preg_replace();

      Das Ganze sieht dann so aus:
      $string = preg_replace('/\D/', ',', $string);

      diese Zeile ersetzt doch alle Zahlen in ein "," oder?
      Ich möchte alle andere als Zahlen ersetzen, das Ergebnis also negiert ;-)

      Sven

      1. Hi

        dazu benutzt man am besten einen regulären Ausdruck zusammen mit der Funktion preg_replace();

        Das Ganze sieht dann so aus:
        $string = preg_replace('/\D/', ',', $string);

        diese Zeile ersetzt doch alle Zahlen in ein "," oder?
        Ich möchte alle andere als Zahlen ersetzen, das Ergebnis also negiert ;-)

        gut wäre auch, wenn aufeinander folgende Kommas automatisch durch eins ersetzt werden

        Sven

        1. Hi

          dazu benutzt man am besten einen regulären Ausdruck zusammen mit der Funktion preg_replace();

          Das Ganze sieht dann so aus:
          $string = preg_replace('/\D/', ',', $string);

          diese Zeile ersetzt doch alle Zahlen in ein "," oder?
          Ich möchte alle andere als Zahlen ersetzen, das Ergebnis also negiert ;-)

          gut wäre auch, wenn aufeinander folgende Kommas automatisch durch eins ersetzt werden

          Sven

          Hmm... also bei mir (PHP5) steht \D für alles außer Zalen ([^0-9]).
          Wenn du immer maximal ein Komma haben willst, sollte das klappen:
          $string = preg_replace('/\D+/', ',', $string);

          MfG

          1. Hi

            Hmm... also bei mir (PHP5) steht \D für alles außer Zalen ([^0-9]).
            Wenn du immer maximal ein Komma haben willst, sollte das klappen:
            $string = preg_replace('/\D+/', ',', $string);

            ich habe das kleine D mit dem großen verwechselt :-\

            somit ist meine Frage auch hinfällig ;-)

            Sven

          2. Hi

            Hmm... also bei mir (PHP5) steht \D für alles außer Zalen ([^0-9]).
            Wenn du immer maximal ein Komma haben willst, sollte das klappen:
            $string = preg_replace('/\D+/', ',', $string);

            kann man auch noch ein bestimmtes Zeichen z.B. % von der Ersetzung ausschliessen?

            Sven

            1. Hi

              Hmm... also bei mir (PHP5) steht \D für alles außer Zalen ([^0-9]).
              Wenn du immer maximal ein Komma haben willst, sollte das klappen:
              $string = preg_replace('/\D+/', ',', $string);

              kann man auch noch ein bestimmtes Zeichen z.B. % von der Ersetzung ausschliessen?

              Sven

              Hi,

              klar geht das:
              $string = preg_replace('/[^\d%]+/', ',', $string)

              Wegen dem [^ wird nur das ersetzt was nicht in den eckigen Klammern steht. Darum diesmal das kleien d (alle Ziffern).
              Alle Zeichen die auch nicht ersetzt werden sollen, kannst du hintendran hängen (und ggf. escapen).

              mfg

              1. Hi

                kann man auch noch ein bestimmtes Zeichen z.B. % von der Ersetzung ausschliessen?

                klar geht das:
                $string = preg_replace('/[^\d%]+/', ',', $string)

                Wegen dem [^ wird nur das ersetzt was nicht in den eckigen Klammern steht. Darum diesmal das kleien d (alle Ziffern).
                Alle Zeichen die auch nicht ersetzt werden sollen, kannst du hintendran hängen (und ggf. escapen).

                ich darf jetzt wohl nicht erzählen, dass ich gerade ein wildes Konstrukt dafür erstellt habe, oder? ;-)

                ich habe noch folgendes geschrieben

                if(substr($string, 0, 1) == ','){  
                  $string = substr($string, 1);  
                }  
                if(substr($string, -1) == ','){  
                  $string = substr($string, 0, -1);  
                }
                

                geht das auch noch in den Regex rein?

                ich sollte mich mal damit intensiver beschäftigen :-)

                Sven

                1. Hi

                  kann man auch noch ein bestimmtes Zeichen z.B. % von der Ersetzung ausschliessen?

                  klar geht das:
                  $string = preg_replace('/[^\d%]+/', ',', $string)

                  Wegen dem [^ wird nur das ersetzt was nicht in den eckigen Klammern steht. Darum diesmal das kleien d (alle Ziffern).
                  Alle Zeichen die auch nicht ersetzt werden sollen, kannst du hintendran hängen (und ggf. escapen).

                  ich darf jetzt wohl nicht erzählen, dass ich gerade ein wildes Konstrukt dafür erstellt habe, oder? ;-)

                  ich habe noch folgendes geschrieben

                  if(substr($string, 0, 1) == ','){

                  $string = substr($string, 1);
                  }
                  if(substr($string, -1) == ','){
                    $string = substr($string, 0, -1);
                  }

                  
                  > geht das auch noch in den Regex rein?  
                  >   
                  > ich sollte mich mal damit intensiver beschäftigen :-)  
                  >   
                  > Sven  
                    
                  Das war schon ein bisschen aufwendiger^^  
                  Die einfachere Variante ist sicher mit zwei replace Funktionen:  
                  $string = preg\_replace('/(^,)|(,$)/','',preg\_replace('/[^\d%]+/', ',', $string ));  
                    
                  Aber ich habs auch in einen Regexp reinbekommen:  
                  $string = preg\_replace('/([^\d%])+/e', 'substr($string ,0,1) == substr($1,0,1) || substr($string ,-1,1) == substr($1,-1,1) ? "" : ","', $string ).'<br />';  
                    
                  Da bei der zweiten Variante noch mit PHP evaluiert wird, halte ich das für auswendiger als die erste Variante.  
                    
                  mfg  
                  Blizz  
                  
                  
                  1. Hi

                    Die einfachere Variante ist sicher mit zwei replace Funktionen:
                    $string = preg_replace('/(^,)|(,$)/','',preg_replace('/[^\d%]+/', ',', $string ));

                    sieht sehr gut aus ;-)

                    bleibt nur noch die Frage, ob man im regex aufeinander folgende Prozentzeichen durch eins ersetzen kann, oder ob man dafür ein weiteren regex braucht :)
                    https://forum.selfhtml.org/?t=147081&m=954472

                    Sven

                    1. Hi

                      Die einfachere Variante ist sicher mit zwei replace Funktionen:
                      $string = preg_replace('/(^,)|(,$)/','',preg_replace('/[^\d%]+/', ',', $string ));

                      sieht sehr gut aus ;-)

                      bleibt nur noch die Frage, ob man im regex aufeinander folgende Prozentzeichen durch eins ersetzen kann, oder ob man dafür ein weiteren regex braucht :)
                      https://forum.selfhtml.org/?t=147081&m=954472

                      Sven

                      Das wäre ähnlich wie mit den Kommata am Anfang und Ende; es geht zwar theoretisch alles in einem RegExp, aber dadurch wird es sehr umständlich.
                      Ich würde hier auch wieder zu einem zweiten Replace tendieren.

                      mfg

              2. Hi

                $string = preg_replace('/[^\d%]+/', ',', $string)

                muss ich um auf einander folgende %-Zeichen durch ein zu ersetzen´, folgendes machen?

                $string = @preg_replace('~[^\d%]+~', ',', $string );

                mir fällt im Moment keine Möglichkeit ein, wie ich dein Ausdruck erweitern müsste, dass ich den 2. Ausdruck weglassen könnte

                Sven

                1. Hi

                  $string = @preg_replace('~[^\d%]+~', ',', $string );

                  hab das falsche reinkopiert :(

                  $string = @preg_replace('~%+~', '%', $string );

                  Sven

    2. Hi

      Das Ganze sieht dann so aus:
      $string = preg_replace('/\D/', ',', $string);

      ich hätte wohl mal besser hinschauen sollen :-)

      kann man folgenden Code noch optimieren?
      $string = @preg_replace('/,+/', ',', @preg_replace('~\D~', ',', $string))

      Sven