nicki: preg_match | Zahl >=500 bis 9 000 000 erlauben

Hallo,
ich möchte in einem Formular nur die Zahlen von 500 - 9 000 000 erlauben.
Ich habe u.a. diesen Code probiert. Müsste doch eigentlich klappen.. Hat jemand eine Idee?

if(!preg_match("/^([5-9][1-9][1-9][1-9][1-9[1-9][1-9]]{3,7})$/i", $wert))  
// Nur 3-7 Zahlen sind möglich und >= 500  
{  
echo "<div class=\"error\">Der Mindestwert beträgt 500.  
Bitte nur Zahlen und ohne Komma eintragen.</div>"  
}

Danke
nicki

  1. Hi,

    Müsste doch eigentlich klappen.. Hat jemand eine Idee?

    </hilfe/charta.htm#tipps-fuer-fragende>

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. Hallo,
    ich möchte in einem Formular nur die Zahlen von 500 - 9 000 000 erlauben.
    Ich habe u.a. diesen Code probiert. Müsste doch eigentlich klappen.. Hat jemand eine Idee?

    if(!preg_match("/^([5-9][1-9][1-9][1-9][1-9[1-9][1-9]]{3,7})$/i", $wert))

    // Nur 3-7 Zahlen sind möglich und >= 500
    {
    echo "<div class="error">Der Mindestwert beträgt 500.
    Bitte nur Zahlen und ohne Komma eintragen.</div>"
    }

    
    >   
    > Danke  
    > nicki  
      
    wieso machst du es dir so kompliziert?  
      
    schau hier:  
      
    ~~~php
    if($wert >=500 && $wert <= 9000000) {  
        echo "Fehler!";  
    }
    

    oder haben wir dich falsch verstanden?

    gruß

    sipatshi

    1. if($wert >=500 && $wert <= 9000000) {

      echo "Fehler!";
      }

      
      >   
      > oder haben wir dich falsch verstanden?  
        
      Hi sipatshi,  
        
      danke dir, das wäre auch eine Möglichkeit. Bin noch am probieren..  
        
      Gruß  
      nicki
      
      1. Schönen guten Tag nicki,

        danke dir, das wäre auch eine Möglichkeit. Bin noch am probieren..

        ich würde es so lösen, dass die Eingabe, die vom Formular kommt, folgendermassen überprüft wird:

        1.) Wurde überhaupt etwas eingegeben?
        2.) Wurden nur Ziffern eingegeben?
        3.) Ist die eingegebene Zahl zwischen 499 und 9000001?

        Als Code kann das so aussehen:

        if( (isset($_POST['input'])) AND (preg_match('~^[0-9]{3,7}$~',$_POST['input'])) AND (intval($_POST['input'])>499) AND (intval($_POST['input'])<9000001) )  
          {  
            $check_result = 'war korrekt!';  
          }  
        else  
          {  
            $check_result = 'war <strong>nicht</strong> korrekt!';  
          }  
        $input = isset($_POST['input']) ? htmlspecialchars($_POST['input']) : '';  
        echo 'Die Eingabe \' '.$input.' \' '.$check_result;
        

        Mit lieben Grüßen

        H. Wolowitz

        --

        Gut, dann können wir die Zettel von den Laternen nehmen...
        1. [latex]Mae  govannen![/latex]

          Als Code kann das so aussehen:

          if( (isset($_POST['input'])) AND (preg_match('~[1]{3,7}$~',$_POST['input'])) AND (intval($_POST['input'])>499) AND (intval($_POST['input'])<9000001) )

          {

            
          Sollte es aber nicht. Durch die Verwendung von intval() in Verbindung mit Vergleichswerten ist preg\_match komplett überflüssig, da ungültige Angaben von intval() zu 0 gewandelt werden und somit automatisch außerhalb des erlaubten Bereiches liegen.  
          Dann kann man noch was für die bessere Verständlichkeit des Codes und des erlaubten Bereiches tun und statt > 499 bzw. < 9000001  jeweils >= 500 bzw. <= 9000000 schreiben.  
            
            
          Stur lächeln und winken, Männer!  
          Kai  
          
          -- 
          `var jQuery = $(hit);`{:.language-javascript}  
          I am Pentium of Borg. Division is futile. You will be approximated.  
            
          [SelfHTML-Forum-Stylesheet](http://selfhtml.knrs.de/#h_stylesheet)  
          
          

          1. 0-9 ↩︎

          1. Schönen guten Tag Kai,

            Durch die Verwendung von intval() in Verbindung mit Vergleichswerten ist preg_match komplett überflüssig, da ungültige Angaben von intval() zu 0 gewandelt werden und somit automatisch außerhalb des erlaubten Bereiches liegen.

            das siehst Du falsch. Das preg_match _sehr wohl_ einen Sinn!

            Wenn ich von einem User verlange, er soll eine ganze Zahl von 500 bis 9 Millionen eingeben, dann soll er das auch tun. Gibt er bei Deinem Code 512.4 ein (und das ist _keine_ ganze Zahl!), dann macht intval() ein 512 daraus und somit würde die Eingabe als gültig durchgehen. Sie ist es aber nicht und deshalb habe ich das preg_match dabei.

            Dadurch sind auch nur jene Eingaben gültig, die ich vom User verlange/erwarte.

            Dann kann man noch was für die bessere Verständlichkeit des Codes und des erlaubten Bereiches tun und statt > 499 bzw. < 9000001  jeweils >= 500 bzw. <= 9000000 schreiben.

            Das ist subjektiv. Mir persönlich sagt meine Variante mehr zu.

            Mit lieben Grüßen

            H. Wolowitz

            --

            Gut, dann können wir die Zettel von den Laternen nehmen...
            1. Hallo,

              Durch die Verwendung von intval() in Verbindung mit Vergleichswerten ist preg_match komplett überflüssig, da ungültige Angaben von intval() zu 0 gewandelt werden und somit automatisch außerhalb des erlaubten Bereiches liegen.
              das siehst Du falsch. Das preg_match _sehr wohl_ einen Sinn!

              kommt drauf an, wie man das sieht.

              Wenn ich von einem User verlange, er soll eine ganze Zahl von 500 bis 9 Millionen eingeben, dann soll er das auch tun. Gibt er bei Deinem Code 512.4 ein (und das ist _keine_ ganze Zahl!), dann macht intval() ein 512 daraus und somit würde die Eingabe als gültig durchgehen. Sie ist es aber nicht und deshalb habe ich das preg_match dabei.

              Ansichts- oder Kontextsache. Wenn ich beispielsweise nach der Fahrpraxis des Nutzers (in km) frage, erwarte ich normalerweise einen gerundeten Wert, zum Beispiel 300000. Gibt mir jemand 281732 an, ist das zwar in der Sache unsinnig, aber nicht weiter schlimm. Und wenn mir irgendein Spaßvogel sogar 122963.25 eingibt und meine Eingabevalidierung macht daraus 122963, dann ist das auch okay. Es ist also, wie gesagt, vom Anwendungsfall abhängig.

              Außerdem hat es einen weiteren Vorteil, wenn ich nicht nach strengen Mustern prüfe: Ich lasse dadurch dem Nutzer die Freiheit, Zahlen so zu formulieren, wie es ihm am besten zusagt - beispielsweise 3E5 anstatt einer 3 mit fünf Nullen, oder 0xC000 anstatt 49152 (z.B. in EDV-technischen Anwendungen).

              Dadurch sind auch nur jene Eingaben gültig, die ich vom User verlange/erwarte.

              Ja, aber ich betrachte das als eine in den meisten Fällen nicht notwendige Beschränkung.

              Dann kann man noch was für die bessere Verständlichkeit des Codes und des erlaubten Bereiches tun und statt > 499 bzw. < 9000001  jeweils >= 500 bzw. <= 9000000 schreiben.
              Das ist subjektiv. Mir persönlich sagt meine Variante mehr zu.

              Das ist wiederum Geschmackssache. Ich schreibe die Grenzen eines Intervalls auch lieber als "glatte" Zahlen und bin damit eher bei Kais Standpunkt.

              So long,
               Martin

              --
              "Mutti, hier steht, das Theater sucht Statisten. Was sind Statisten?" - "Das sind Leute, die nur rumstehen und nichts zu sagen haben." - "So wie Papa?"
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            2. [latex]Mae  govannen![/latex]

              Durch die Verwendung von intval() in Verbindung mit Vergleichswerten ist preg_match komplett überflüssig, da ungültige Angaben von intval() zu 0 gewandelt werden und somit automatisch außerhalb des erlaubten Bereiches liegen.

              das siehst Du falsch. Das preg_match _sehr wohl_ einen Sinn!

              Nein.

              Wenn ich von einem User verlange, er soll eine ganze Zahl von 500 bis 9 Millionen eingeben, dann soll er das auch tun. Gibt er bei Deinem Code 512.4 ein (und das ist _keine_ ganze Zahl!), dann macht intval() ein 512 daraus und somit würde die Eingabe als gültig durchgehen. Sie ist es aber nicht und deshalb habe ich das preg_match dabei.

              Entweder die 512.4 ist ein für das Programm in dieser Form gültiger Wert, dann kann mit ihm unverändert weitergearbeitet werden oder es wird ein Integer-Wert erwartet, dann wird selbstverständlich mit dem von intval() zurückgegebenen Wert weitergearbeitet.
              preg_match() wird in beiden Fällen nicht benötigt.

              Ansonsten sollte auch das beachtet zu werden, was Martin schrieb. Weshalb sollte man jemanden zwingen, beispielsweise 1000000000000 einzutippen statt 1E12

              Stur lächeln und winken, Männer!
              Kai

              --
              var jQuery = $(hit);
              Wir sind die Schlumpf. Widerschlumpf ist schlumpflos. Wir werden Sie einschlumpfen.
              SelfHTML-Forum-Stylesheet
              1. Schönen guten Tag Kai,

                das siehst Du falsch. Das preg_match _sehr wohl_ einen Sinn!

                Nein.

                doch!

                Entweder die 512.4 ist ein für das Programm in dieser Form gültiger Wert, dann kann mit ihm unverändert weitergearbeitet werden oder es wird ein Integer-Wert erwartet, dann wird selbstverständlich mit dem von intval() zurückgegebenen Wert weitergearbeitet.

                Das mag in spezifischen Fällen so sein. Das ändert aber nichts daran, dass es ohne dem pregmatch nicht möglich ist, zu kontrollieren, ob wirklich nichts anderes als eine ganze Zahl eingegeben worden ist, unabhängig davon, ob Du das jetzt als relevant ansiehst oder nicht.

                preg_match() wird in beiden Fällen nicht benötigt.

                Wenn es für die Weiterverarbeitung eines speziellen Falls unwichtig ist, stimmt das, wenn es von Bedeutung ist oder man - wieso auch immer - möchte, dass _nur_ ganze Zahlen eingegeben werden, stimmt das _nicht_. Und deshalb ist es nicht korrekt, meine Lösung als generell "falsch" anzuprangern.

                Ansonsten sollte auch das beachtet zu werden, was Martin schrieb. Weshalb sollte man jemanden zwingen, beispielsweise 1000000000000 einzutippen statt 1E12

                Siehst Du, und das ist der Unterschied zwischen Technikern, Informatikern oder Mathematikern und den normalen Menschen. Denn _kein_ normaler Mensch auf dieser Welt käme auf die Idee, 1E12 einzugeben, obwohl das natürlich mathematisch korrekt ist.

                Mit lieben Grüßen

                H. Wolowitz

                --

                Gut, dann können wir die Zettel von den Laternen nehmen...
                1. @@Wolowitz:

                  nuqneH

                  das siehst Du falsch. Das preg_match _sehr wohl_ einen Sinn!

                  Nein.

                  doch!

                  Nein.

                  dass es ohne dem pregmatch nicht möglich ist, zu kontrollieren, ob wirklich nichts anderes als eine ganze Zahl eingegeben worden ist

                  Wirklich nicht?

                  Und deshalb ist es nicht korrekt, meine Lösung als generell "falsch" anzuprangern.

                  Das tat auch niemand. Sie wurde als „nicht gut“ angeprangert, und das ist korrekt.

                  Denn _kein_ normaler Mensch auf dieser Welt käme auf die Idee, 1E12 einzugeben, obwohl das natürlich mathematisch korrekt ist.

                  Vielleicht sind diejenigen, die die Schreibweise 1E12 kennen, wirklich nicht „normal“. Aber warum sollte man denen die Möglichkeit verwehren, die Zahl in der Form einzugeben?

                  Qapla'

                  --
                  „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                  1. Schönen guten Tag Gunnar,

                    das siehst Du falsch. Das preg_match _sehr wohl_ einen Sinn!

                    Nein.

                    doch!

                    Nein.

                    Doch!

                    dass es ohne dem pregmatch nicht möglich ist, zu kontrollieren, ob wirklich nichts anderes als eine ganze Zahl eingegeben worden ist

                    Wirklich nicht?

                    Das ist mir nicht neu. Laut OP kommt der Wert aber aus einem Formular, wird also als String übernommen. Also nutzt diese Funktion hier nichts. Ich bleibe dabei: Wenn der User nichts anderes als ganze Zahlen eingeben darf, verwende ich meine Lösung mit dem pregmatch.

                    Mit lieben Grüßen

                    H. Wolowitz

                    --

                    Gut, dann können wir die Zettel von den Laternen nehmen...
                    1. Om nah hoo pez nyeetz, Wolowitz!

                      Das ist mir nicht neu. Laut OP kommt der Wert aber aus einem Formular, wird also als String übernommen. Also nutzt diese Funktion hier nichts. Ich bleibe dabei: Wenn der User nichts anderes als ganze Zahlen eingeben darf, verwende ich meine Lösung mit dem pregmatch.

                      is_int(is_numeric(Zeichenkette));

                      Matthias

                      --
                      1/z ist kein Blatt Papier.

                      1. Om nah hoo pez nyeetz, Matthias Apsel!

                        is_int(is_numeric(Zeichenkette));

                        natürlich nicht so. Aber grundsätzlich: is_numeric prüft, ob eine Zeichenkette eine Zahl ist, macht also inetwa das, was du mit deinem regulären Ausdruck überprüfen möchtest.

                        Matthias

                        --
                        1/z ist kein Blatt Papier.

                    2. Hallo,

                      das siehst Du falsch. Das preg_match _sehr wohl_ einen Sinn!

                      Nein.

                      doch!

                      Nein.

                      Doch!

                      Wenn man jedem von euch einen Lolli gibt, hört ihr dann auf und vertragt euch wieder?

                      dass es ohne dem pregmatch nicht möglich ist, zu kontrollieren, ob wirklich nichts anderes als eine ganze Zahl eingegeben worden ist

                      schließe mich da den anderen an, warum willst du korrekte eingaben unterm tisch fallen lassen?
                      bspw.

                      • 512.0
                      • 1E4
                      • 5.99E3 (<-- gut das ist jetzt wirklich übertrieben, aber zulässig)

                      Mit lieben Grüßen

                      H. Wolowitz

                      martachen

                    3. @@Wolowitz:

                      nuqneH

                      das siehst Du falsch. Das preg_match _sehr wohl_ einen Sinn!

                      Nein.

                      doch!

                      Nein.

                      Doch!

                      Nein.

                      Also nutzt diese Funktion hier nichts.

                      Da hast du wohl recht. Aber if (is_numeric($_GET['foo']) && (intval($_GET['foo']) == floatval($_GET['foo'])))

                      Qapla'

                      --
                      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                      1. Schönen guten Tag Gunnar,

                        Da hast du wohl recht. Aber if (is_numeric($_GET['foo']) && (intval($_GET['foo']) == floatval($_GET['foo'])))

                        das ist zwar länger als mein pregmatch, aber Hauptsache, man weiß schon wieder alles besser. Ich werde mich jetzt aus diesem Thread - und auch von diesem Forum - zurückziehen, mir geht diese dauernde Besserwisserei nämlich langsam am Arsch!

                        Ich habe hier kürzlich in einem Post gelesen, dass das Ungleichgewicht zwischen Fragenden und Antwortenden bedauert wird. Mich wundert das überhaupt nicht, dass hier der Großteil nur zum Fragen und nicht zum Antworten herkommt.

                        Ich beobachte seit Langem, nicht nur bei mir, dass völlig egal, was wo als Antwort geschrieben wird, es eine Gruppe von Leuten gibt, die jedes Posting bis auf den letzten Buchstaben zerlegen und einfach nichts unversucht lassen, dauernd den Oberlehrer raushängen zu lassen, um ihr Ego aufzupolieren und besser dazustehen.

                        Nicht falsch verstehen - ich spreche nicht von der Korrektur völlig falsch dargestellter Fakten. Natürlich sollen und müssen Falschaussagen verbessert werden! Aber dieses zwanghafte Verbessern und Runtermachen von Ideen und Gedanken anderer um jeden Preis zerstört wirklich die letzte Lust, hier aktiv zu werden.

                        Denn _völlig_ egal, was man schreibt, es dauert nicht lange, bis der erste kommt, um einen zu belehren. Wenn Belehrung etwas ist, wo ich jemanden unterstütze, jemanden etwas verständlich beibringe oder ergänze - und das mit einer sozial kompetenten Artikulation - dann ist das gut und wichtig! Aber hier habe ich oft des Gefühl, die Intuition hinter einer Antwort ist nicht, jemandem weiterhelfen zu wollen, sondern die Befriedigung des Ausbesserns und Belehrens.

                        Das beste Beispiel war vor kurzem die völlig sinnlose Diskussion um meine Formuliereng "mehrdimensionales Array".

                        Und auch in diesem aktuellen Post war es nicht möglich, meinen Lösungsansatz als OK stehen zu lassen. Da wird sogar ein noch längerer Codeabschnitt gepostet, nur um endlich zeigen zu können, dass mein Lösungsweg nicht gebraucht wird. Und das - und ich bleibe dabei - obwohl meine Lösung mit dem pregmatch ein akzeptabler Weg ist, um sicherzustellen, dass nur Ziffern eingegeben worden sind, wenn man das sicherstellen möchte. Und da hat es _null_ Relevanz, ob es jetzt jemand gut oder schlecht findet, bei der Eingabe nur Ziffern zuzulassen. _Wenn_ man das regulieren möchte, dann ist der von mir vorgeschlagene Weg sicher kein schlechter oder falscher! Aber ich sehe, dass einfach nicht sein kann, was nicht sein darf und "gebe mich geschlagen". Ich wollte einfach nur helfen...

                        Ich hatte mir eigentlich vorgenommen, in diesem Forum in Zukunft, soweit dies mein bescheidenes Wissen zuläßt, aktiv mitzumachen und auch bei Fragen mitzuarbeiten. Aber nachdem, was ich bisher persönlich erlebt habe und was ich gesehen habe, wie auch bei anderen Postern über deren Ideen, Gedanken und Lösungsvorschläge teilweise drübergefahren wird, hat sich das mit dem heutigen Tag erübrigt.

                        Auf Nichtmehrwiedersehen!

                        H. Wolowitz

                        --

                        Gut, dann können wir die Zettel von den Laternen nehmen...
                        1. @@Wolowitz:

                          nuqneH

                          … um ihr Ego aufzupolieren …

                          Oder geht es hier gar nicht um ein aufpoliertes, sondern um ein angeknackstes Ego? Und zwar um deins?

                          Qapla'

                          --
                          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                  2. Hallo,

                    Vielleicht sind diejenigen, die die Schreibweise 1E12 kennen, wirklich nicht „normal“.

                    doch, sehr normal. Jeder, der schon mal sehr große oder sehr kleine Zahlen mit einem Taschenrechner oder einem Computerprogramm verwurstet hat, dürfte diese Schreibweise schon gesehen haben. Ob man sie tatsächlich selbst "aktiv" benutzen möchte, ist wieder eine andere Frage.

                    Aber warum sollte man denen die Möglichkeit verwehren, die Zahl in der Form einzugeben?

                    Eben. Wenn es Entwicklungs- und Programmieraufwand (und Testaufwand) bedeutet, zusätzliche Varianten zu erlauben, die nur von einer kleinen Minderheit genutzt würden, dann mag es vernünftig sein, diesen Aufwand zu sparen. Wenn es aber zusätzlichen Aufwand kostet, gegebene Möglichkeiten einzuschränken, sehe ich den Sinn nicht.

                    So long,
                     Martin

                    --
                    Zwischen Leber und Milz
                    passt immer noch'n Pils.
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                2. Tach!

                  Entweder die 512.4 ist ein für das Programm in dieser Form gültiger Wert, dann kann mit ihm unverändert weitergearbeitet werden oder es wird ein Integer-Wert erwartet, dann wird selbstverständlich mit dem von intval() zurückgegebenen Wert weitergearbeitet.
                  Das mag in spezifischen Fällen so sein. Das ändert aber nichts daran, dass es ohne dem pregmatch nicht möglich ist, zu kontrollieren, ob wirklich nichts anderes als eine ganze Zahl eingegeben worden ist, unabhängig davon, ob Du das jetzt als relevant ansiehst oder nicht.

                  ctype_digit() existiert. Abgesehen davon, wenn eine Ziffernfolge gewünscht ist, wie bei Telefonnummern, Postleitzahlen, Seriennummern und ähnlichem, dann ist eine Muster-Prüfung sinnvoll. Im vorliegenden Fall aber, bei dem es nur auf den Wert einer Zahl ankommt, ist es wirklich völlig unerheblich, in welchem Format diese eingegeben wird. Intern wird sie (sollte sie zumindest) sowieso in einem Zahlentyp (int, float) und nicht in einem String abgelegt. Dabei verliert sie automatisch das bei der Eingabe verwendete Aussehen, weswegen eine Musterprüfung keinen anderen Sinn mehr ergibt, als den Anwender technisch unnötig einzuschränken.

                  Siehst Du, und das ist der Unterschied zwischen Technikern, Informatikern oder Mathematikern und den normalen Menschen. Denn _kein_ normaler Mensch auf dieser Welt käme auf die Idee, 1E12 einzugeben, obwohl das natürlich mathematisch korrekt ist.

                  Und trotzdem ist das kein Grund, die Welt zu einem Einheitsbrei zwingen zu wollen. Die Technik gibt es her, es ist auch kein Mehraufwand. (Skalare) $_GET/$_POST-Inhalte sind zunächst immer Strings. Als Wert verwendete Zahlen müssen deshalb sowieso in ein Zahlenformat konvertiert werden, die Prüfung auf den Wertebereich braucht es auch und ist auf numerischer Ebene deutlich einfacher (zu schreiben und zu verstehen) als eine Musterprüfung.

                  dedlfix.

    2. @@Sipatshi:

      nuqneH

      if($wert >=500 && $wert <= 9000000) {

      echo "Fehler!";
      }

      
      >   
      > oder haben wir dich falsch verstanden?  
        
      Ja. Der Bereich [500, 9000000] soll erlaubt sein, nicht die Fehlermeldung schneißen.  
        
      Qapla'
      
      -- 
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      
  3. ich möchte in einem Formular nur die Zahlen von 500 - 9 000 000 erlauben.
    Hat jemand eine Idee?

    http://community.de.selfhtml.org/zitatesammlung/zitat1418

    Warum prüfst du nicht einfach, ob der eingegebene wert größer gleich 500 und kleiner gleich 9000000 ist? Wozu willst du mit einem PCRE herumwursteln, der für diese Anforderung mehr unhandlich als nützlich ist?

    echo "<div class="error">Der Mindestwert beträgt 500.

    Diese Ausgabe deckt sich nicht mit deinem Maximalwert von 9000000

  4. Hi,

    ich möchte in einem Formular nur die Zahlen von 500 - 9 000 000 erlauben.
    Ich habe u.a. diesen Code probiert. Müsste doch eigentlich klappen.. Hat jemand eine Idee?

    Zahlenbereiche mit Regex zu prüfen ist eher schwierig.

    Dein Suchausdruck:
    ^([5-9][1-9][1-9][1-9][1-9[1-9][1-9]]{3,7})$

    Die Klammerung () ist überflüssig, da Du mit ^ und $ erzwingst, daß der ganze String matcht.
    Der gefundene Bereich ist also, wenn es einen Treffer ergibt, der gesamte ursprüngliche String.

    Bleibt also das hier:

    [1][1-9][1-9][1-9][1-9[1-9][1-9]]{3,7}$

    ^ erzwingt das Matching am Stringanfang.

    [5-9] die erste Ziffer muß also zwischen 5 und 9 (jeweils inklusive) sein. Das paßt schon nicht zu Deiner Forderung, eine Zahl zwischen 500 und 9000000 zu treffen. Denn 1000 liegt zwischen 500 und 9000000 - fängt aber mit einer 1 an, die von Dir nicht erlaubt wird.

    [1-9][1-9][1-9] die zweite bis vierte Ziffer dürfen also keine 0 sein. Warum nicht? Paßt nicht zu Deiner Aufgabe.

    [1-9[1-9] an fünfter Stelle darf also 1 bis 9 oder [ stehen. Dafür braucht es aber die 1-9 nicht doppelt in der Klammer ... Hm. Die [ paßt nicht zu Deiner Forderung, daß es eine Zahl sein muß.

    [1-9] nochmal eine nicht-0-Ziffer.

    und zum Schluß
    ]{3,7}$ Also ]]] oder ]]]] oder ]]]]] oder ]]]]]] oder ]]]]]]]
    paßt auch nicht

    Mach es Dir einfacher, und verwende höchstens einen Regex, um zu prüfen, ob der String nur aus Ziffern besteht:
    [2]+$ oder ^\d+$  (hierbei ggf. den \ escapen, wenn Du "" außenrum verwendest)

    Und die Prüfung auf den Zahlenbereich mit < und > bzw. <= und >= ...

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.

    1. 5-9 ↩︎

    2. 0-9 ↩︎

    1. Tach!

      Mach es Dir einfacher, und verwende höchstens einen Regex, um zu prüfen, ob der String nur aus Ziffern besteht:

      Im einfachsten Fall reicht statt Regex schon is_numeric(), wenn auch Hex- und andere Schreibweisen gestattet sind. Ansonsten ctype_digit() (falls ctype eingebunden ist).

      dedlfix.

      1. Hi,

        Mach es Dir einfacher, und verwende höchstens einen Regex, um zu prüfen, ob der String nur aus Ziffern besteht:

        Im einfachsten Fall reicht statt Regex schon is_numeric(), wenn auch Hex- und andere Schreibweisen gestattet sind. Ansonsten ctype_digit() (falls ctype eingebunden ist).

        Ich schrieb ja auch "höchstens" ;-)

        Ich mach schon länger nichts mehr mit PHP, darum kenn ich die Funktionen nicht mehr so gut ...

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    2. Hi Andreas,

      erstmal Danke für deine ausführliche Analyse. Ich habe noch mal etwas rumprobiert - so könnte es klappen.

      Variante 1 (Länger, mit Trennpunkt, 500-9.000.000)
      if(!preg_match("/^(([5-9][0-9][0-9])|([1-9]+\.+[0-9][0-9][0-9]+\.?+[0-9]?[0-9]?[0-9]?))$/i", $wert))

      Variante 2 (Kürzer, nach oben offen, 500-unendlich)
      if(!preg_match("/^([5-9][0-9][0-9])|([1-9][0-9]{3,})$/i", $wert))

      Gruß
      nicki

      1. Hi,

        if(!preg_match("/^(([5-9][0-9][0-9])|([1-9]+\.+[0-9][0-9][0-9]+\.?+[0-9]?[0-9]?[0-9]?))$/i", $wert))

        Irgendwie hab ich den Eindruck, daß Du relativ planlos Teile, die Du irgendwo in Regexen gesehen hast, zusammenwirfst.

        Der Ausdruck ist schon syntaktisch falsch - das Plus nach dem ? ist dort nicht erlaubt.
        Wenn man das wegläßt, ergibt die zweite Alternative

        ([1-9]+.+[0-9][0-9][0-9]+.?[0-9]?[0-9]?[0-9]?

        Das erlaubt z.B.
        1111111111111...............0099999999999999.

        Die vielen Einser wegen [1-9]+
        Die vielen Punkte wegen .+
        Die zwei Nuller für [0-9][0-9]
        Die vielen Neuner für [0-9]+
        Der Punkt für .?
        Danach nichts mehr, da nach den letzten 3 [0-9] jeweils ein ? steht.

        Wie bereits gesagt: Prüfe, ob nur Ziffern vorhanden sind. Mit Regex ^\d+$, und erledige die Bereichsprüfung mit $x >= 500 && $x <= 9000000.
        Den Bereich mit Regex prüfen zu wollen, ist sehr aufwendig.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. Hallo,

          Irgendwie hab ich den Eindruck, daß Du relativ planlos Teile, die Du irgendwo in Regexen gesehen hast, zusammenwirfst.

          Nein, da liegst du falsch, ich habe versucht mich schon eingehender mit der Materie zu beschäftigen. Leider sind gute UND ausführlich erklärte Tuts in dem Bereich rar gesät. Ich hatte mich hier mal eingelesen.

          Der Ausdruck ist schon syntaktisch falsch - das Plus nach dem ? ist dort nicht erlaubt.
          Wenn man das wegläßt, ergibt die zweite Alternative

          OK, mit ".+" war ich mir nicht sicher.

          Danach nichts mehr, da nach den letzten 3 [0-9] jeweils ein ? steht.

          Das Fragezeichen sagt nur aus, es KANN noch eine Zahl folgen muss aber nicht. Siehe
          hier

          Wie bereits gesagt: Prüfe, ob nur Ziffern vorhanden sind. Mit Regex ^\d+$, und erledige die Bereichsprüfung mit $x >= 500 && $x <= 9000000.
          Den Bereich mit Regex prüfen zu wollen, ist sehr aufwendig.

          Da hast du wohl Recht.
          Danke.
          nicki

          cu,
          Andreas

          1. Danach nichts mehr, da nach den letzten 3 [0-9] jeweils ein ? steht.

            Das Fragezeichen sagt nur aus, es KANN noch eine Zahl folgen muss aber nicht. Siehe
            hier

            "kann muss aber nicht" sicher - aber entscheidend dafür ist das + - das bedeutet 1 oder mehrfach

            Wenn man das isoliert betrachtet [0-9]+.? bedeutet 0. oder 00. oder 001. oder 12331233312. oder 123123133123 oder 12222222222222222222222222222222222222222222222222222222222222222222222222222.

            Das ist nicht was du willst - wenn du nur dreiergruppen erlauben willst, dann kannst du auf ([0-9]{3}.?){0,2} als Untermuster prüfen. Du willst bei den Ziffergruppe in der mitte ja exakt drei Ziffern optional gefolgt von einem Tausendertrennzeichen und diese Wiederholung 0, 1 oder 2x

  5. @@nicki:

    nuqneH

    ich möchte in einem Formular nur die Zahlen […]

    Dann solltest du den Typen des Eingabefeldes entsprechend angeben: @type="number". Geräte mit virtueller Tastatur bieten dann eine numerische an. (Tipphilfen)

    […] von 500 - 9 000 000 erlauben.

    Dafür gibt es die Attribute @min und @max: <input type="number" min="500" max="9000000"/>

    Und schon schickt ein moderner Broser (Safari gehört nicht dazu) das Formular bei falsch ausgefülltem Feld gar nicht erst ab, sondern gibt eine entsprechende Fehlermeldung aus.

    Um eine serverseitige Prüfung kommst du natürlich dennoch nicht drumrum. Aber wie Sipatshi sagte, Zahlen als Zahlen behandeln (nur eben richtig), nicht mit Zeichenkettenoperationen darauf rumhacken.

    (Man könnte auch eine Datumseingabe inkl. Schaltjahrregel mit regulärem Ausdruck prüfen, sollte dies aber nicht tun.)

    Qapla'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    1. Om nah hoo pez nyeetz, Gunnar Bittersmann!

      (Man könnte auch eine Datumseingabe inkl. Schaltjahrregel mit regulärem Ausdruck prüfen, sollte dies aber nicht tun.)

      Ich kann kaum glauben, dass du deinen Beitrag nicht gefunden hast. ;-)

      Matthias

      --
      1/z ist kein Blatt Papier.

      1. @@Matthias Apsel:

        nuqneH

        Ich kann kaum glauben, dass du deinen Beitrag nicht gefunden hast. ;-)

        Ich hab nicht gesucht.

        Eher auf erstaunte Fragen „Echt? Wie denn?“ gewartet. ;-)

        Qapla'

        --
        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)