Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Per RegEx jede beliebige Form von Preis erkennen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Per RegEx jede beliebige Form von Preis erkennen

    Hi!

    Da RegEx ein Schwachpunkt bei mir ist, frage ich mal die, die sich besser auskennen werden:

    Ich brauche für preg_replace ein RegEx, dass jede erdenkliche Formulierung eines Preises erkennt, also zB:

    € 45,-
    € 45
    € 45,00
    45 €
    45,- €
    45,00 €
    45.000 €
    $ 45.000,--
    € 4.000,00
    usw usw usw

    Werde ich da geschachtelte preg_replaces brauchen (ich will den Preis aus einem beliebigen String EINMALIG erkennen und mit einem <span>-Tag umschließen) oder geht das auch mit einem einzelnen, großen RegEx?

    MfG


  • #2
    € 4.000,00
    ...
    $ 45.000,--
    Du solltest nochwas zur Währung schreiben. Welche gehören dazu? Was ist wenn EUR und USD steht etc.. Du weißt das ein US-Bürger vermutlich 45,000.-- schreibt? Zu berücksichtigen? etc..

    jede erdenkliche Formulierung eines Preises
    Und als Preis ist es verankert, wenn ? Direkt davor oder danach mit maximal Abstand eines Leerzeichen(?) ein Währungssymbol befinden? (Im Gegensatz zu einer "normalen" Zahl).
    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Das sehe ich auch so, hausl. Die obigen Beispiele bedient dieser primitive RegEx
      PHP-Code:
      ~^(?=.*\d)(?=.*[€$£₤])(?!.*[a-z?!äöüß]).*$~iu 
      Der Ausdruck ist geeignet die obigen Beispiele zu überprüfen, nicht aber derartige Texte aus beliebigen Strings rauszufischen.
      PHP-Klassen auf github

      Kommentar


      • #4
        sicher sicher: ich werde heute 2. 5 euro hab ich gekriegt.
        die aufgebenstellung scheint mir vom TE einfach nicht durchdacht:
        ich will den Preis aus einem beliebigen String EINMALIG erkennen

        Kommentar


        • #5
          Zitat von hausl Beitrag anzeigen
          Und als Preis ist es verankert, wenn ? Direkt davor oder danach mit maximal Abstand eines Leerzeichen(?) ein Währungssymbol befinden? (Im Gegensatz zu einer "normalen" Zahl).
          Ein Preis gilt dann als Preis, wenn auf jeden Fall vor oder nach einer Zahl (Ganzzahl oder Kommazahl, mit oder ohne 1000er-Trennung, ",-" als Platzhalter für ",00") ein Währungszeichen kommt oder eine ISO-4217-Bezeichnung (also eben EUR, USD, etc...), optional mit oder ohne EINEM Leerzeichen zwischen Zahl und Währungssymbol.

          Was Währungen angeht reicht es derzeit vollkommen, wenn es sich auf Euro, Dollar, Pfund und Schweizer Franken beschränkt.

          Ums noch klarer zu machen:

          Preis:
          € 45.000,-
          45 USD
          CHF 0,77
          $ 23000

          Kein Preis:
          46.000,95
          6
          4,3
          € (mit mehr als einem Leerzeichen dazwischen) 45,00
          $ 46foobar

          Kommentar


          • #6
            Wie bereits gesagt wurde - da andere Nationen andere Tausendertrenner/Dezimaltrenner verwenden, ist die Aufgabe nicht eindeutig lösbar.
            --

            „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


            • #7
              Mir war langweilig...

              PHP-Code:
              <?php
              $prices     
              = array(chr(8364).' 45.000,-''45 USD''CHF 0,77'chr(36).' 23000''USD 23000''46.000,95''6''4,3'chr(8364).'  45,00'chr(36).' 46foobar',
                                  
              chr(8364).' 45,-'chr(8364).' 45'chr(8364).' 45,00''45 '.chr(8364), '45,- '.chr(8364), '45,00 '.chr(8364), '45.000 '.chr(8364),
                                  
              chr(36).' 45.000,--'chr(8364).' 4.000,00''Ich werde heute 2. 5 euro hab ich gekriegt.');
              $currencies '(?:EURO?|USD|DOLLAR|GBP|POUND|CHF|FR|SFR|\\'.chr(8364).'|\\'.chr(36).'|\\'.chr(163).')';
              $price      '(?:(?:(?:[1-9][0-9]{0,2}(?:\.|,)?)+(?:[0-9]{3})|(?:[0-9]|[1-9][0-9]{1,2}))(?:(?:\.|,)(?:[0-9]{2}|\-{1,2}))?)';
              $regex      '(?:^|\s+)(?:(?:(?:'.$currencies.'\s?)'.$price.')|(?:'.$price.'(?:\s?'.$currencies.')))(?:\s+|$)';
              foreach(
              $prices as $check) {
                    echo 
              str_pad($check15' 'STR_PAD_RIGHT).' '.(preg_match('/'.$regex.'/i'$check$match) ? 'matched: ' 'did not match.').(count($match) ? $match[0] : '')."\n";
              }
              ?>
              Code:
              € 45.000,-      matched: € 45.000,-
              45 USD          matched: 45 USD
              CHF 0,77        matched: CHF 0,77
              $ 23000         matched: $ 23000
              USD 23000       matched: USD 23000
              46.000,95       did not match.
              6               did not match.
              4,3             did not match.
              €  45,00        did not match.
              $ 46foobar      did not match.
              € 45,-          matched: € 45,-
              € 45            matched: € 45
              € 45,00         matched: € 45,00
              45 €            matched: 45 €
              45,- €          matched: 45,- €
              45,00 €         matched: 45,00 €
              45.000 €        matched: 45.000 €
              $ 45.000,--     matched: $ 45.000,--
              € 4.000,00      matched: € 4.000,00
              Ich werde heute 2. 5 euro hab ich gekriegt. matched:  5 euro
              VokeIT GmbH & Co. KG - VokeIT-oss @ github

              Kommentar


              • #8
                Ja da wird er sich aber freuen

                LG
                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  Bei den Leerzeichen bitte das geschützte Leerzeichen berücksichtigen.

                  Kommentar


                  • #10
                    PHP-Code:
                    $prices     = array(chr(8364).' 45,000,-''45.000.000 USD''45,000,000 USD'chr(36).' 0''USD 0,00''USD 1.000.095,00''0,000.1 USD','0.000,1 USD''EURO 4,3'chr(8364).' 45,001.555');
                    $currencies '(?:EURO?|USD|DOLLAR|GBP|POUND|CHF|FR|SFR|\\'.chr(8364).'|\\'.chr(36).'|\\'.chr(163).')';
                    $price      '(?:(?:(?:[1-9][0-9]{0,2}(?:\.|,)?)+(?:[0-9]{3})|(?:[0-9]|[1-9][0-9]{1,2}))(?:(?:\.|,)(?:[0-9]{2}|\-{1,2}))?)';
                    $regex      '(?:^|\s+)(?:(?:(?:'.$currencies.'\s?)'.$price.')|(?:'.$price.'(?:\s?'.$currencies.')))(?:\s+|$)';
                    foreach(
                    $prices as $check) {
                          echo 
                    str_pad($check15' 'STR_PAD_RIGHT).' '.(preg_match('/'.$regex.'/i'$check$match) ? 'matched: ' 'did not match.').(count($match) ? $match[0] : '')."\n";

                    ¬ 45,000,- matched: ¬ 45,000,-
                    45.000.000 USD did not match.
                    45,000,000 USD did not match.
                    $ 0 matched: $ 0
                    USD 0,00 matched: USD 0,00
                    USD 1.000.095,00 did not match.
                    0,000.1 USD did not match.
                    0.000,1 USD did not match.
                    EURO 4,3 did not match.
                    ¬ 45,001.555 did not match.
                    --

                    „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


                    • #11
                      $ 0 matched: $ 0
                      is ja ok

                      0,000.1 USD did not match.
                      0.000,1 USD did not match.
                      Haarspalter
                      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                      PHP.de Wissenssammlung | Kein Support per PN

                      Kommentar


                      • #12
                        Tatsache, die 3er-0-Blöcke hab ich da vergessen, den Spaß überlass ich aber jemand Anderem.
                        Ich würde mal behaupten für den Anfang ist es doch schonmal ein ganz netter Ansatz.
                        VokeIT GmbH & Co. KG - VokeIT-oss @ github

                        Kommentar


                        • #13
                          Die Frage ist, wozu man so etwas eigentlich braucht.
                          --

                          „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


                          • #14
                            Der Ansatz von G.Schuster ist mal ein sehr guter, mit dem ich arbeiten kann! Danke dir dafür!

                            Ich werd mich einfach (endlich) mal intensiv mit RegEx auseinandersetzen, dann werd ich das Problem mit den tausender-trennern auch noch lösen

                            Kommentar


                            • #15
                              Zitat von nikosch Beitrag anzeigen
                              Die Frage ist, wozu man so etwas eigentlich braucht.
                              Gibt es dazu auch eine Antwort? Das wäre echt interessant. Vor allem das es in den Daten scheinbar kaum eine Konvention was Geldbeträge angeht zu geben schein, wenn man sich die "möglichen, erlaubten" Varianten aussieht. Was liest du da aus?
                              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                              PHP.de Wissenssammlung | Kein Support per PN

                              Kommentar

                              Lädt...
                              X