Chatbot: Funktion 1+1= like Google

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

  • Chatbot: Funktion 1+1= like Google

    Hallo Zusammen,

    ich bin grade bei der Erstellung eines ChatBots und möchte eine Funktion realisieren, die wie bei Google eine Rechenaufgabe löst.

    Dafür muss ja zunächst mal erkannt werden, dass überhaupt eine Rechenaufgabe ist - das ist mit einer RegEx möglich soweit ich weiß.

    Wenn ich jetzt aber z.B.: eine Eingabe wie "1+1" habe, kann ich die direkt als PHP ausführen - gibt es da eine einfache Möglichkeit? Funktion?

    Oder muss man "1+1" in "1", "+", "1" zerlegen und kann manuell berechnen?

    Erstes wäre nätürlich schöner, weil PHP ja alle diese Funktionen von zur Verfügung stellt...

    Danke für einen Tipp!
    dreman

  • #2
    Mit Regex geht das wohl nicht:

    3 Plaumen * 5 Pflaumen = 15 Pflaumen. Wie soll Regex jetzt erkennen, dass das eine Formel oder ein Suchbegriff ist??

    eval () um den Mist mit PHP auszuführen, aber kann a) gefährlich sein b) funktioniert mit dem obigen Beispiel nicht.

    Kommentar


    • #3
      Re: Chatbot: Funktion 1+1= like Google

      Original geschrieben von dreman
      Wenn ich jetzt aber z.B.: eine Eingabe wie "1+1" habe, kann ich die direkt als PHP ausführen - gibt es da eine einfache Möglichkeit? Funktion?
      eval() kannst du generell zum Ausführen von PHP-Code nutzen.
      Du müsstest also 1+1 in einen Form bringen, die gültigen PHP-Code darstellt - z.B. '$ergebnis = 1+1;'

      Aber von eval wird aus gutem Grund in den allermeisten Fällen abgeraten -
      Oder muss man "1+1" in "1", "+", "1" zerlegen und kann manuell berechnen?
      - das wäre wesentlich besser.

      Was wäre nämlich, wenn dein regulärer Ausdruck löchrig wäre (sei es by design, oder aufgrund eines Bugs in der Implementierung)?
      Dann könnte u.U. auch PHP-Code übergeben werden, sei es bspw. ein unlink-Aufruf - wenn du den dann per eval einfach ausführst, Gute Nacht.


      Also mein Fazit: Entweder eigenen Parser für solche Rechenausdrücke schreiben - oder bleiben lassen.
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        du könntest mit eval arbeiten, allerdings ist das in einem chat eine tödliche sicherheitslücke. daher müßtest du den eintrag erst per preg_match überprüfen, also nur zahlen und +,-,/ zulassen.

        gruß
        peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          Danke für die Antworten und Hinweise.

          Habe es jetzt so gelöst:

          PHP-Code:
          $rechnung="22*20";

          if(
          preg_match("/^([0-9]+)(\+|\-|\*|\/|\%)([0-9]+)$/"$rechnung)){
              echo 
          "OK!";
              eval (
          "\$erg = $rechnung;");
              echo 
          $rechnung."=".$erg;
          }
          else{
              echo 
          "ERROR! - keine Rechnung!";

          Die Regel geht jetzt allerding nur für reine Rechungen.

          Wie bekomme ich es denn hin, z.B.: "was ist denn 1+1?" richtig auszuwerten.

          Bzw. wie komme ich an die Position der eigentlichen Rechung ran?
          preg_match prüft ja nur ob eine drin ist, gell?

          Danke für eure Hilfe!
          dreman

          Kommentar


          • #6
            Die Stringfunktionen in der Manual http://de.php.net/manual/de/ref.strings.php helfen dir da sicherlich weiter. Wenn du eine Rechnung entdeckst (über preg_macht) gibts du das halt als Ergebnis aus.
            Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

            Kommentar


            • #7
              oh, dann mach mal folgendes:
              Code:
              " 1    +   1    "
              oder
              Code:
              "1/0"
              oder
              Code:
              9999999999999999999 * 99999999999999999
              oder
              Code:
              09+08
              ich bin mal auf die ergebnisse gespannt...

              Kommentar


              • #8
                Danke für den Tipp mit den Leerzeichen.

                Habe jetzt folgendes Konstrukt:

                PHP-Code:
                $suchmuster_rechnung1="/^.*([0-9]+)([:space:]*)(\+|\-|\*|\/|\%)([:space:]*)([0-9]+).*$/"
                Damit möchte ich auch Rechnung finden, die so aufgebaut sind:
                Code:
                "1     +    1"
                Leider kommt wegen dem [:space:] folgende Fehlermeldung:

                Warning: Compilation failed: POSIX named classes are supported only within a class at offset 12 in [...]

                Was mache ich falsch?
                dreman

                Kommentar


                • #9
                  du hast im manual zu regulären ausdrücken (pcre) nicht nachgeschaut, wie man leerzeichen (besser - whitespaces) kennzeichnet.

                  und du hast die restlichen 3 ausgaben nicht gezeigt.

                  Kommentar


                  • #10
                    THX, [[:space:]] hatte ich übersehen:

                    PHP-Code:
                    $suchmuster_rechnung1="/^.*([0-9]+)[[:space:]]*(\+|\-|\*|\/|\%)[[:space:]]*([0-9]+).*$/"
                    Jetzt wird auch
                    PHP-Code:
                    "1    +             1" 
                    erkannt!

                    Besten Dank!

                    dreman

                    Kommentar


                    • #11
                      die letzten drei ausgaben willst du mir verschweigen?

                      Kommentar


                      • #12
                        Ja, habe ein @ vor eval geschrieben und x/0 werde ich noch ausschließen.
                        Und "08+08" ist für *mich* keine Rechnung =)

                        Dass das noch lange nicht perfekt ist, ist mir klar - soll ja nur exemplarisch zeigen was geht!

                        dreman

                        Kommentar


                        • #13
                          die letzten drei ausgaben willst du mir verschweigen?
                          OffTopic:
                          Natürlich will er das ... erzeugen ja PHP Fehler die sich (bis auf den letzen (Regex erweitern)) auch nicht so verhindern lassen ... (beim vorletzen könnte man die maximale Anzahl der möglichen Zahlen natürlich auch noch festlegen)
                          EDIT:
                          @? na super ...
                          Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                          Kommentar


                          • #14
                            Original geschrieben von dreman
                            Und "08+08" ist für *mich* keine Rechnung =)
                            aber für dein programm. daher interessiert mich die ausgabe. und außerdem meinte ich 09+08.

                            Kommentar


                            • #15
                              @program: Ist klar, wenn ich @eval([...]) nutze wird die Fehlermeldung unterdrückt und es kommt "0" raus...

                              Oder was genau meinst du?

                              Kommentar

                              Lädt...
                              X