Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Regulärer Ausdruck

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Regulärer Ausdruck

    Morgen,

    ich möchte einen regulären Ausdruck erstellen, der die Eingabe einer Summe überprüft.

    Folgende Kriterien sollen erfüllt werden:

    - wenn mehrstellig vor einem Komma, keine führende Null.
    - Summe darf 20,00 nicht überschreiten
    - Nullwert ist nicht erlaubt

    Das soll erlaubt sein:

    0,01
    1,01
    0,10
    10,01
    10
    19,99
    20
    20,0
    20,00

    Das nicht:

    01,01
    20,01
    0
    0,0
    0,00
    10,

    Mein Ansatz bis jetzt:

    (0(?=,([0-9]*[1-9]){1,1}[0-9]*){1,2}

    Eine "0" gefolgt von einem Komma und ein oder zwei Ziffern 0-9 wovon mindestens einer Ziffer 1-9 ist.

    |(1{1,1}[0-9]*){1,2}

    oder eine 1 gefolgt von maximal einer mögicherweise vorkommenden Ziffer 0-9

    |2(?=(0|0,|0,00)))

    oder eine 2 aber nur wenn diese von "0" oder "0,0" oder "0,00" gefolgt wird

    ,{0,1}

    gefolgt von einem möglicherweise einmal vorkommenden Komma

    [0-9]{0,2}

    gefolgt von ein oder zwei möglichweise vorkommenden Ziffern 0-9


    <?php

    $test = '19,01';

    if (preg_match('/^(0(?=,([0-9]*[1-9]){1,1}[0-9]*){1,2}|(1{1,1}[0-9]*){1,2}|2(?=(0|0,|0,00))),{0,1}[0-9]{0,2}$/',$test)) echo 'ok';
    else echo 'nicht ok';

    Da scheint aber der Wurm drin zu sein :-/

    Könnte mir jemand helfen?

    If ($betrag >20||$betrag<0.01) ginge natürlich auch. Ich möchte aber nicht den Betrag prüfen, sondern den regulären Ausdruck dafür erstellen.


  • #2
    Ich bin jetzt hier:

    ^((0{1,1}(?=,([0-9]*[1-9]{1,1}[0-9]*){1,2}))|(1{1,1}[0-9]{0,1})|(2{1,1}(?=(0|,0|,00|0,0|0,00){0,1}))|[3-9]{1,1}(?=,{1,1}))(,{1,1}[0-9]{1,2}){0,1}$


    Mein spezielles Problem sind die Nachkommastellen einer 20

    (2{1,1}(?=(0|,0|,00|0,0|0,00){0,1}))



    2{1,1}

    Eine 2, sofern sie einmal vorkommt

    (?=

    Und wenn sie gefolgt wird von

    (0|,0|,00|0,0|0,00){0,1}

    "0" oder ",0" oder ",00" oder "0,0" oder "0,00" oder nichts

    20,99 wird aber trotzdem gematched :-/

    Kommentar


    • #3
      Wie wäre es mit einem anderen Ansatz? Teile den String am Komma auf und arbeite dann mit Bedingungen und einfacheren Ausdrücken. Um die größe einer Zahl zu prüfen, eignet sich ein regulärer Ausdruck meiner Meinung nach nicht so gut.
      http://hallophp.de

      Kommentar


      • #4
        PHP-Code:
        $summe 1.11;
        $summe str_replace(',''.'$summe);
        if (!
        is_numeric($summe) || $summe 20 || $summe 0) {
            throw new 
        Exception('Invalid Sum!');
        }
        $summe number_format($summe2'.'''); 
        "My software never has bugs, it just develops random features."
        "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

        Kommentar


        • #5
          Vielleicht funktioniert dieser Ausdruck:
          Code:
          /^(((0,([1-9]\d?|\d[1-9])|1\d?(,\d{1,2})?))|20(,0{1,2})?)$/
          Aber ich halte wie gesagt einen Ansatz wie den von Paul.Schramenko für sinnvoller. Wieso soll es denn ein regulärer Ausdruck sein?
          http://hallophp.de

          Kommentar


          • #6
            Zitat von phpsecretary Beitrag anzeigen
            ^((0{1,1}(?=,([0-9]*[1-9]{1,1}[0-9]*){1,2}))|(1{1,1}[0-9]{0,1})|(2{1,1}(?=(0|,0|,00|0,0|0,00){0,1}))|[3-9]{1,1}(?=,{1,1}))(,{1,1}[0-9]{1,2}){0,1}$
            Ich bin jetzt nicht so sicher, aber ich denke, dass mein Ansatz ein kleines bischen verständlicher ist, wenn jemand auf den Code schaut...
            "My software never has bugs, it just develops random features."
            "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

            Kommentar


            • #7
              Zitat von Paul.Schramenko Beitrag anzeigen
              Ich bin jetzt nicht so sicher, aber ich denke, dass mein Ansatz ein kleines bischen verständlicher ist, wenn jemand auf den Code schaut...
              Unwesentlich
              http://hallophp.de

              Kommentar


              • #8
                Mir geht es nicht um die Prüfung der Zahl, sondern um die lookarounds und generelle Syntax von Regulären Ausdrücken.

                Für diesen Anwendungsfall gibt es bestimmt Myrriarden weiterer Möglichkeiten der Prüfung. Auch das Exceptionhandling kann man verwenden (ich habe allerdings irgendwann mal das userdefined errorhandling eingebunden und verwende dieses stattdessen, um mich gegen die Javasierung von PHP zu wehren und nachfolgende Entwickler zu verwirren: trigger_error('Invalid Sum!', E_USER_NOTICE). Ist alles eine Frage der Klassifizierung von Fehlern...

                Um noch mal auf meine eigentliche Frage zurück zu kommen...

                Hat zufällig jemand grade O'Reilly's "Reguläre Ausdrücke" zur Hand und kann mal für mich nachschlagen so ca. ab der Hälfte des Buchs (den Teil den ich damals nur überflogen habe *tüdelü*)?

                Kommentar


                • #9
                  Hat zufällig jemand grade O'Reilly's "Reguläre Ausdrücke" zur Hand und kann mal für mich nachschlagen so ca. ab der Hälfte des Buchs (den Teil den ich damals nur überfolgen habe *tüdelü*)?
                  Was soll das denn jetzt werden?
                  Um noch mal auf meine eigentliche Frage zurück zu kommen...
                  Könnte mir jemand helfen?
                  Dann sagst du uns vielleicht lieber noch mal wobei und was das Kapitel in dem erwähnten Buch damit zu tun hat.
                  http://hallophp.de

                  Kommentar


                  • #10
                    PHP-Code:
                    /^(((0,([1-9]\d?|\d[1-9])|1\d?(,\d{1,2})?))|20(,0{1,2})?)$/ 
                    Die "2" wird nicht gematched, sonst siehts aber gut aus...

                    Hab ich viel zu kompliziert gedacht :-/

                    Was mich aber eigentlich immer noch nicht weiterbringt, weil ich nen Anwendungsfall eben für oben genannte lookarounds zu finden gehofft hatte.

                    Vielleicht hat jemand eine Idee, wo man diese sonst verwenden kann und wie sie denn verwendet werden? Evtl. In Kombination mit einem Anwendungsfall mit bedingten Ausdrücken?

                    Kommentar


                    • #11
                      Zitat von phpsecretary Beitrag anzeigen
                      Die "2" wird nicht gematched, sonst siehts aber gut aus...
                      Stimmt, so ist es besser:
                      Code:
                      /^(((0,([1-9]\d?|\d[1-9])|(1\d?|2)(,\d{1,2})?))|20(,0{1,2})?)$/
                      Was mich aber eigentlich immer noch nicht weiterbringt, weil ich nen Anwendungsfall eben für oben genannte lookarounds zu finden gehofft hatte.
                      Ich habe sie zum ersten Mal zum Parsen einer Templatedatei benötigt: http://www.php.de/php-einsteiger/529...chenkette.html

                      Ich weiß nicht, ob man genau festlegen kann, wann man auf Look-around Assertions zurückgreifen muss und wann nicht. Es gibt immer mehrere Ansätze und Lösungen für ein Problem, so auch bei regulären Ausdrücken, denn ein Muster kann man natürlich mit unterschiedlichen Mitteln nachbilden. Wenn man gleich eine ganze Zeichenkette an einer bestimmten Position ausschließen oder verlangen möchte, sind sie sicherlich notwendig. Auch für dein Problem kann man sicher eine Lösung finden, in der Assertions zum Einsatz kommen.
                      Man sollte sich aber nicht zwingen, diese unbedingt und immer einzusetzen. Vom Gefühl her würde ich sagen, dass sie relativ inperformant sind.

                      Klar möchtest du vermutlich nur etwas üben, aber so läufst du Gefahr, immer eine Lösung mit Assertions basteln zu wollen. Ich gehe immer so vor, dass ich den Eingabestring auf ein Muster untersuche und bestmöglich nachbilde. Wenn ich dann an bestimmten Stellen nicht mit den vordefinierten Zeichenklassen, Quantifizierern etc. weiterkomme, überlege ich mir, ob Assertions eine Möglichkeit sein könnten.

                      Gruß
                      http://hallophp.de

                      Kommentar


                      • #12
                        Wie/wozu Assertions verwendet werden, steht zum Beispiel im PHP-Handbuch: PHP: Assertions - Manual

                        Sie lassen sich etwa im Zusammenhang mit preg_split recht elegant einsetzen:

                        Hier ein Beispiel (von Chriz aus diesem Thread):

                        PHP-Code:
                        $string   "thisIsCamelCased";
                        $splitter preg_split("/(?=[A-Z])/"$string); // look behind assertion
                        $splitter array_map("ucfirst"$splitter);
                        $filename implode(DIRECTORY_SEPARATOR$splitter) . ".php"// This/Is/Camel/Cased.php
                        echo $filename
                        (Ist allerdings "look ahead", nicht "look behind".</nitpick>)

                        Kommentar


                        • #13
                          Klar möchtest du vermutlich nur etwas üben, aber so läufst du Gefahr, immer eine Lösung mit Assertions basteln zu wollen.
                          Worin liegt denn die Gefahr, wenn ichs exessiv nutze? Kann es nicht auch vorteilhaft sein?
                          Ich spare zum Beispiel die Obfuscation, wenn ich einen Quelltext nicht gleich für jede Drupal|Joomla|Wordpress-Webdesigner-Klitsche wartbar machen möchte.

                          Eigentlich wollte ich mir das aber auch nur mal anschauen, weil ichs irgendwann mal nur überflogen hatte und es mir seit dem immer mal wieder im Kopf rumgegeistert hat. Eben wie heute.

                          Habs jetzt verstanden und stelle das erst mal wieder in den Schrank zu den anderen Teilen, die die Welt nicht braucht

                          Besten Dank allen!

                          Kommentar


                          • #14
                            Ausgehend von der AUsgangsfrage würde ich jedenfalls zwei der drei genannten Voraussetzungen mit nativem Code ohne Ausdrücke umsetzen.
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar


                            • #15
                              Das Problem des Goldenen Hammers...
                              Wenn du einen Hammer hast, kannst du damit irgendwann sehr seeeehr gut Nägel reinschlagen. Aber irgendwann bekommst du schrauben und dann versuchst dus eben auch mit dem Hammer, was aber viel einfacher und besser mit einem Schraubenzieher gehen würde...

                              Anti-Pattern – Wikipedia
                              "My software never has bugs, it just develops random features."
                              "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                              Kommentar

                              Lädt...
                              X