Gero: Ami-Zahlen und preg_match

Wunderschönen Samstag Morgen an alle ,

ich habe gleich zwei Problemchen. Vielleicht kann mir hier jemand dabei helfen.

1. Ich habe in zwei Strings jeweils eine Zahl in amerikanischem Zahlenformat.

10,520 u. 9,400

Ich möche mit diesen beiden Zahlen rechnen. Einfach z.Bsp. 10,520 / 9,400.

Leider kommt 1,1111 raus. Was sicherlich an dem Komma liegt. Ich habe zuerst versucht das Komma mit strg_replace zu entfernen, aber dann passiert gar nichts. Auch number_format($string, 2, '.', '')/number_format($string2, 2, '.', ''); hat nicht geholfen.

Was muss ich tun/verwenden um mit diesen beiden Zahlen rechnen zu können? Ich brauche das Ergebnis mit 2 Nachkommestellen. Ich sollte vielleicht erwähnen, das es auch durchaus sein kann, das der String keine 1000er zahl enthalten kann (bspw. 980)

2. Mein nächstes Problem ist das "parsen" einer bestimmten Info aus einer Webseite. Probiert habe ich es so:

if (preg_match('%.*Win' /></dt>
                <dd>(.*?)</dd>%s', $inhalt, $b)) {
    $wins = $b[1];
}

Der Code der Quelle(Webseite) sieht wie folgt aus:

<dt><img src="http://www.domains.com/winner/win.gif" alt='Win' /></dt>
                <dd>50</dd>

Versucht habe ich auch if (preg_match('%.*Win' /></dt>\n<dd>(.*?)</dd>%s', $inhalt, $b)) {
    $wins = $b[1];
}

Die Webseite habe ich mit $inhalt = file_get_contents() geladen. Aber das war bestimmt klar ;)

Was mache ich da falsch? Hat hier vielleicht jemand eine Lösung/einen Ansatz parat?

Vielen Dank

  1. Hallo,

    1. Ich habe in zwei Strings jeweils eine Zahl in amerikanischem Zahlenformat.

    10,520 u. 9,400

    Ich möche mit diesen beiden Zahlen rechnen. Einfach z.Bsp. 10,520 / 9,400.
    Leider kommt 1,1111 raus. Was sicherlich an dem Komma liegt.

    ja

    Ich habe zuerst versucht das Komma mit strg_replace zu entfernen, aber dann passiert gar nichts.

    das ist aber der richtige Weg.

    Auch number_format($string, 2, '.', '')/number_format($string2, 2, '.', ''); hat nicht geholfen.

    das ist kein Wunder. number_format formatiert Zahlen als String.

    Was muss ich tun/verwenden um mit diesen beiden Zahlen rechnen zu können?

    Mit str_replace die Kommata entfernen, anschließend

    - die implizite Konvertierung nutzen
     - explizit umwandeln, sei es mit der entsprechenden Funktion, per Cast, oder Typ-Festlegung. Wie Du siehst, gibt es viele Möglichkeiten.

    Ich brauche das Ergebnis mit 2 Nachkommestellen.

    Sorge dafür, dass das *Ergebnis* die zwei gewünschten Nachkommastellen. Für diese Aufgabe gibt es mehrere Funktionen, eine hast Du bereits selbst genannt.

    Ich sollte vielleicht erwähnen, das es auch durchaus sein kann, das der String keine 1000er zahl enthalten kann (bspw. 980)

    Das macht für str_replace keinen Unterschied, es werden null Vorkommen ersetzt.

    1. Mein nächstes Problem ist das "parsen" einer bestimmten Info aus einer Webseite. Probiert habe ich es so:

    if (preg_match('%.*Win' /></dt>
                    <dd>(.*?)</dd>%s', $inhalt, $b)) {
        $wins = $b[1];
    }

    Schau Dir mit var_dump den Inhalt von $b an.

    Der Code der Quelle(Webseite) sieht wie folgt aus:

    <dt><img src="http://www.domains.com/winner/win.gif" alt='Win' /></dt>
                    <dd>50</dd>

    Was mache ich da falsch?

    Deine Vorstellung des Ergebnisses stimmt nicht mit dem Ergebnis überein :-)
    Es ist eine elementare Debugging-Technik, sich den Inhalt von Variablen anzeigen zu lassen, die nicht das enthalten, was man erwartet.

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      zur Zahl:

      Mit str_replace die Kommata entfernen, anschließend

      Das war der richtige Anstoß. Vielen Dank ;)

  2. Hallo,

    Ich habe zuerst versucht das Komma mit strg_replace zu entfernen, aber dann passiert gar nichts.

    doch:
    $iZahl = str_replace(',', '', '$sZahl);

    1. Mein nächstes Problem

    Bitte in Zukunft einen eigenen Thread...

    if (preg_match('%.*Win' /></dt>
                    <dd>(.*?)</dd>%s', $inhalt, $b)) {
        $wins = $b[1];
    }

    • Wieso du % als Begrenzer nimmst, leuchtet mir nicht ein, aber egal (du kannst z.B. = nehmen...)
    • ich würde immer mit \s* bzw. \s+ nach whitespace suchen
    • erwartest du nut Zahlen? dann \d+ nehmen.
    • statt (.*?) kannst du hier auch ([^<]*) benutzen

    zu dem Flag s: ich würde gi benutzen (http://de.selfhtml.org/perl/sprache/regexpr.htm#flags)

    Der Code der Quelle(Webseite) sieht wie folgt aus:

    Oder einfach nur der Quältext™ der Website (denn man benutzt Definitionslisten normalerweise um in Textform etwas zu definieren, nicht um Tabellenstrukturen nachzubauen)

    Die Webseite habe ich mit $inhalt = file_get_contents() geladen. Aber das war bestimmt klar ;)

    nö, aber ich hatte gehofft, dass du das irgendwie machst... vielleicht über cURL, o.ä., das Verfahren ist eher unwichtig

    mfg, Flo

    --
    sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
    1. Hallo levu!

      »» 2. Mein nächstes Problem
      Bitte in Zukunft einen eigenen Thread...

      Nein, warum? Es ist im Titel erkennbar, dass der OP zwei Fragen hat, der Titel ist gut gewählt und eine Archivsuche sowohl für das eine Thema (Tausender-Trennzeichen) als auch für das andere (Reguläre Ausdrücke in PHP) wird Erfolg haben.

      Ich wünsche mir mehr solcher, aussagekräftiger Titel (anstatt »Hilfe!!!!!11elf«) ;)

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --
      _ - jenseits vom delirium - _

         Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
      1. Weck mich einer!

        Nein, warum? Es ist im Titel erkennbar, dass der OP zwei Fragen hat, der Titel ist gut gewählt und eine Archivsuche sowohl für das eine Thema (Tausender-Trennzeichen) als auch für das andere (Reguläre Ausdrücke in PHP) wird Erfolg haben.

        Aargh, ich bin noch nicht ganz wach.
        Vergiß alles.

        Dennoch ist es nicht notwendig, bei zwei Fragen zwei Threads zu eröffnen, meiner Meinung nach.

        Viele Grüße aus Frankfurt/Main,
        Patrick, holt sich jetzt ausnahmsweise ein KAFFEE!

        --
        _ - jenseits vom delirium - _

           Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
        1. Hallo,

          Weck mich einer!

          Tätärätäääääää!

          der Titel ist gut gewählt

          ich bedanke mich :D

          Dennoch ist es nicht notwendig, bei zwei Fragen zwei Threads zu eröffnen, meiner Meinung nach.

          naja, ich finde, es ist dann besser, wenn der eine schon gelöst ist, dann kann er im Archiv verschwinden und der andere kann weiter diskutiert werden...

          mfg, Flo

          --
          sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
          1. Hallöle!

            naja, ich finde, es ist dann besser, wenn der eine schon gelöst ist, dann kann er im Archiv verschwinden und der andere kann weiter diskutiert werden...

            Hm, kommt darauf an; ich finde ja immer, dass es sehr interessant für die Sicht aufs Gesamte ist, wenn jemand eine Sache machen will und dabei zwei Probleme hat (oder eins dem anderen nachfolgt).

            Ich hab' da neulich mal eine Karikatur gesehen, die das sehr schön illustriert, was ich meine. Da standen also einige Wissenschaftler um einen Elefanten herum. Der eine beguckt sich das Bein und sagt: "Das ist ein Baumstamm", der nächste schaut sich den Rüssel an und sagt: "Das ist ein Schlauch", der dritte guckt auf den Schwanz und meint: "Das ist ein Pinsel". Nur den ganzen Elefanten nehmen sie halt nicht wahr.

            So etwas passiert gern mal, wenn eben der Blick aufs Ganze verlorengeht. Deswegen neige ich dazu, tatsächlich auch dann zuzustimmen, wenn jemand bei einer offensichtlich weiterführenden Frage trotz des gelösten Ursprungsproblems ein Doppelposting "anmeckert".

            File Griese,

            Stonie

            --
            It's no good you trying to sit on the fence
            And hope that the trouble will pass
            'Cause sitting on fences can make you a pain in the ass.
            Und im Übrigen kennt auch Stonie Wayne.
            1. Hallo,

              Hm, kommt darauf an; ich finde ja immer, dass es sehr interessant für die Sicht aufs Gesamte ist, wenn jemand eine Sache machen will und dabei zwei Probleme hat (oder eins dem anderen nachfolgt).

              naja, wenn sie zusammengehören, meinetwegen, aber das hier hatte imho nichts miteinander zu tun

              mfg, Flo

              --
              sh:) fo:| ch:? rl:( br:^ n4:| ie:{ mo:| va:} de:> zu:} fl:{ ss:) ls:< js:|
              1. Hi Flo,

                naja, wenn sie zusammengehören, meinetwegen, aber das hier hatte imho nichts miteinander zu tun

                War ja auch nur 'ne generelle Anmerkung.

                File Griese,

                Stonie

                --
                It's no good you trying to sit on the fence
                And hope that the trouble will pass
                'Cause sitting on fences can make you a pain in the ass.
                Und im Übrigen kennt auch Stonie Wayne.
    2. Hallo,

      »» if (preg_match('%.*Win' /></dt>
      »»                 <dd>(.*?)</dd>%s', $inhalt, $b)) {
      »»     $wins = $b[1];
      »» }

      • ich würde immer mit \s* bzw. \s+ nach whitespace suchen

      Vielen Dank für Deine Antwort. Das Thema ist für mich neu. Was genau meinst Du damit?

      • erwartest du nut Zahlen? dann \d+ nehmen.

      Letztendlich will ich nur die immer vorhandene Zahl zwischen
      'Win' /></dt>
                      <dd>

      und

      </dd> finden.

    3. Hallo,

      » if (preg_match('%.*Win' /></dt>
      »                 <dd>(.*?)</dd>%s', $inhalt, $b)) {
      »     $wins = $b[1];
      » }

      • Wieso du % als Begrenzer nimmst, leuchtet mir nicht ein, aber egal (du kannst z.B. = nehmen...)

      warum nicht? Es leuchtet ein, dass er den Slash nicht will. Das Gleichheitszeichen ist ebenfalls sehr irritierend; ich vermiede es in jedem Fall. Das Prozentzeichen finde hier angemessen gewählt.

      • ich würde immer mit \s* bzw. \s+ nach whitespace suchen

      ja, der Abschnitt von <dt> bis <dd> ist mutig :-)

      • erwartest du nut Zahlen? dann \d+ nehmen.

      Ziffern bitte ;-) Ein weiterer sinnvoller Verbesserungvorschlag.

      • statt (.*?) kannst du hier auch ([^<]*) benutzen

      warum kompliziert, wenn es auch einfach geht?

      Wenn die RegExpe matchen, ist es immer noch wichtig, sich den Inhalt von $b anzuschauen.

      Alternativ wäre es eine Idee, den zugegebenermaßen komplizierten Handbuchabschnitt zu Arrays [1] durchzuarbeiten oder sich daran zu erinnern, welchen numerischen Index PHP für das erste Arrayelement vergibt, wenn keine explizite Schlüsselzuordnung vorgenommen wird.

      Freundliche Grüße

      Vinzenz

      [1] vor der entscheidenden Information gibt es noch zwei Hinweise zum
          gleichen Thema, die in die Irre führen könnten.