Regex für/gegen Viagra steht nicht so ganz

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

  • Regex für/gegen Viagra steht nicht so ganz

    Mein Postfix ist (neben anderen Vorkehrungen) auch Dank regex ziemlich kurz und wirksam.
    Gegen Mail-Varianten der blauen Pille im Betreff war ich bis jetzt sicher.
    PHP-Code:
    /^Subject:.*v[\W_]{0,2}[i1][\W_]{0,2}[a@][\W_]{0,4}g[\W_]{0,2}r[\W_]{0,2}[a@].*/    REJECT 
    Der Spaßmacher rauschte aber durch.
    Subject: Viiaaaagra... - 1.79$ Jetzt bestellen und Spass haben -- But you don't just

    Überlegungen
    - vorab: .*
    - V: v[\W_]{0,2} #case-sensitive
    - ii: [i1][\W_]{0,2}
    - aaaa: [a@][\W_]{0,4}
    - g: g[\W_]{0,2}
    - r: r[\W_]{0,2}
    - a: [a@].*

    In einigen Jahren ist mein Ohr für entsprechende Angebote vielleicht etwas offener. Momentan will und muss ich davon nichts wissen. An welcher Stelle schlüft der Pillenvertreter durch - doch nicht etwa schon beim V?
    Und ist man alt wie ein Kuh, lernt man immer noch dazu.
    THX, LOL, ROFL & Co. -> Netzjargon auf Wikipedia

  • #2
    Re: Regex für/gegen Viagra steht nicht so ganz

    Ich weiß zwar nicht, was [a@] ist, aber in meiner Welt matcht v nur mit V, wenn man case-insensitive sucht.

    Kommentar


    • #3
      edit:
      - V: v[\W_]{0,2} #case-sensitive --> #case-insensitive Standard

      [a@]: entweder ein a oder ein @, welches ggf durch {0,3} halt 0 oder 3 mal vorkommen kann.
      caseinsenitive mit /i meinte ich bisher nicht setzen zu müssen, da es Postfix bei den regex egal ist, ob groß oder klein geschrieben wird.
      U.u. kommt aber der OberChecker [W_] als Störenfied in die Quere?
      Und ist man alt wie ein Kuh, lernt man immer noch dazu.
      THX, LOL, ROFL & Co. -> Netzjargon auf Wikipedia

      Kommentar


      • #4
        \w
        any "word" character
        \W
        any "non-word" character
        Vielleicht meinst du ersteres??

        Kommentar


        • #5
          \w
          any "word" character
          \W
          any "non-word" character
          genau, denn diese Kollegen wollen mir nicht so recht schmecken vor allem in Verbindung mit z.B. {0,4}
          Bei regex ist der Löffel der Weisheit ohnehin an mir vorbeigegangen. Ich bereue und arbeite dran. Und just obiges Beispiel zeugt davon.

          statt:
          /^Subject:.*v[W_]{0,2}[i1][W_]{0,2}[a@][W_]{0,4}g[W_]{0,2}r[W_]{0,2}[a@].*/ REJECT

          besser so:
          /^Subject:.*v{0,2}[W_][i1]{0,2}[W_][a@]{0,4}[W_]g{0,2}[W_]r{0,2}[a@].*/ REJECT

          ???
          Zuletzt geändert von Husti; 05.12.2007, 10:56.
          Und ist man alt wie ein Kuh, lernt man immer noch dazu.
          THX, LOL, ROFL & Co. -> Netzjargon auf Wikipedia

          Kommentar


          • #6
            Du hast es immer noch nicht!
            Code:
            \w => ein "Wort"-Zeichen
            \W => ein "Nicht-Wort"-Zeichen
            Hausaufgabe: Ordne die Buchstaben v, i, a, g und r in eine der zwei Gruppen ein!

            Kommentar


            • #7
              Du hast es immer noch nicht!
              Könnte daran liegen, dass ich versuche, dieses eine Probleme parallel zu meinen anderen Aufgaben zu lösen.
              Sorry - ich war da nicht ganz bei der Sache obwohl du dir dafür Zeit genommen hast.

              Ich werde jetzt \W in \w ändern und prüfen.

              Danke für den Tip und nochmals Entschuldigung.
              Und ist man alt wie ein Kuh, lernt man immer noch dazu.
              THX, LOL, ROFL & Co. -> Netzjargon auf Wikipedia

              Kommentar


              • #8
                # \w : ein Buchstabe, eine Ziffer oder der Unterstrich, also [a-zA-Z_0-9] (und evtl. weitere Buchstaben, z. B. Umlaute)
                # \W : ein Zeichen, das weder Buchstabe noch Zahl noch Unterstrich ist, also [^\w]

                Weder das eine noch das andere prüft die eigentlichen Buchstaben v, i, a, g, r. UNd daher schwänze ich die angeordnete Hausaufgabe.

                Es wird doch geprüft, was jeweils dazwischen stehen könnte
                - # \W : .|$§()=/\
                - # \w : a-zA-Z_0-9

                Daher ist das \W schon nicht ganz verkehrt. Die Angabe zur möglichen Anzahl trudelt.
                Und ist man alt wie ein Kuh, lernt man immer noch dazu.
                THX, LOL, ROFL & Co. -> Netzjargon auf Wikipedia

                Kommentar


                • #9
                  Das Suchwort ist Viagra mit einer beliebigen Anzahl der Buchstaben, wie in deinem Beispiel Viiaaaagra.
                  Ich persönlich würde die Regex so basteln:
                  Code:
                  /^Subject:.*v*[i1]*[a@]*g*r*[a@]*.*/i
                  Soll auch Viia.a@-gra gefunden werden, ist \w natürlich nicht korrekt. Kommt das denn aber vor, dass ein Sonderzeichen (außer @) dazwischen steht?

                  Kommentar


                  • #10
                    V|iagra
                    V|agra
                    V!agra
                    V/agra
                    (Pfizer? freut sich)
                    Und ist man alt wie ein Kuh, lernt man immer noch dazu.
                    THX, LOL, ROFL & Co. -> Netzjargon auf Wikipedia

                    Kommentar


                    • #11
                      Die oben fehlenden Backslashes \W sind natürlich immer da gewesen.

                      Heiße Nadel und eigentlich viel zu fett:

                      /^Subject:.*v{0,2}[\W_]{0,2}[i1]{0,2}[\W_]{0,2}[a@]{0,4}[\W_]{0,2}g{0,2}[\W_]{0,2}r{0,2}[a@].*/ REJECT

                      # v{0,2}: Null bis 2 mal das v
                      # [\W_]{0,2}: kein bis zwei Nicht-Buchstaben/Nicht-Zahlen
                      # [i1]{0,2}: kein bis zwei i ODER 1
                      # [\W_]{0,2}: kein bis zwei Nicht-Buchstaben/Nicht-Zahlen
                      # [a@]{0,4}: kein bis vier a oder @
                      # [\W_]{0,2}: kein bis zwei Nicht-Buchstaben/Nicht-Zahlen
                      # g{0,2}: Null bis 2 mal das g
                      # [\W_]{0,2}: kein bis zwei Nicht-Buchstaben/Nicht-Zahlen
                      # r{0,2}: Null bis 2 mal das r
                      # [a@].*: a ODER @ und wildcard danach
                      Und ist man alt wie ein Kuh, lernt man immer noch dazu.
                      THX, LOL, ROFL & Co. -> Netzjargon auf Wikipedia

                      Kommentar


                      • #12
                        Begriffserkennung

                        Mit den regulären Ausdrücken wirst du nicht glücklich werden. Egal wie komplex du den Ausdruck baust, es wird immer noch sehr einfach sein, sich eine Schreibweise einfallen zu lassen, die der Ausdruck nicht "frisst".

                        Moderne Spamfilter arbeiten mit einem Punktesystem, ähnlich dem Punktesystem in Flensburg. Wird eine (Mail-)Verkehrsregel verletzt, gibt's Punkte und ab x Punkten ist der Lappen weg.

                        Hier mal eine Übersichtsliste der Filterkriterien von SpamAssassin, einem Open Source Projekt: http://spamassassin.apache.org/tests_3_2_x.html
                        "Viagra" ist noch deren kleinste Sorge.

                        Wenn du also vor Cialia, Viagra und "Is HE too small" einigermassen sicher sein willst, dann solltest du die Begriffe über eine Fuzzy Logic vergleichen und Grenzwerte setzen, ab denen ein Begriff für dich unter "Spam" fällt.

                        In PHP bieten sich dafür beispielsweise die Befehle Levenshtein oder similar_text an.

                        Mal ein paar Beispiele:

                        PHP-Code:
                        // Ergibt 1
                        $str1 "viagra"$str2 "viagra"
                        echo  
                        1-levenshtein($str1$str2)/max(strlen($str1), strlen($str2));

                        // Ergibt ~0.83
                        $str1 "viagra"$str2 "v/agra"

                        // Ergibt 0.14
                        $str1 "viagra"$str2 "venedig"
                        Wenn man den Wert auf >0.4 überprüft, sollte man einigermassen auf der sicheren Seite sein. Zudem kann man andere "böse" Begriffe wie "Cialis" in einen Array zusammen mit dem jeweiligen Grenzwert packen, um dann alle Begriffe im Betreff zu überprüfen.
                        Happiness is an empty error log

                        Kommentar


                        • #13
                          Re: Begriffserkennung

                          Original geschrieben von Cymon
                          In PHP bieten sich dafür beispielsweise die Befehle Levenshtein oder similar_text an.
                          Mailfilter in einer interpretierten Sprache wie PHP sind viel zu langsam und haben zu viel Overhead.

                          Dieser Ausdruck ist mit einem Spamfilter nicht zu vergleichen. Das steht wohl außer Frage. Ich nehme an, es ist nur ein "Vorfilter", um den spamd zu entlasten.
                          Ein gutes* Beispiel, wie sowas nach hinten losgehen kann. Denn der Spamassassin hätte die genannte Mail wahrscheinlich aussortiert. Leider hat er noch nie zuvor etwas von Viagra gehört ...

                          *) Eigentlich kein gutes Beispiel. Mein SA übergeht das Wort Viagra (skip:V 10, spamprob 0.285728) - wahrscheinlich wegen der Pünktchen dahinter. Aber das Prinzip paßt: Wenn man den SA per Vorfilter am Lernen hindert, ist er nicht vorbereitet, wenn mal etwas den Vorfilter passiert.

                          Kommentar


                          • #14
                            Bevor sich mein SA mit medizinischen Erzeugnissen befasst und dabei Ressourcen vernascht, wird schon an der Türe geprüft (u.a. auch mit header_checks, body_checks, rbl) wer rein darf und wo weitere Prüfungen reine Zeitverschwendung sind.
                            Ich prüfe parallel was im Endeffekt praktische Wirkung zeigt.

                            Andererseits hatte ich mit regex bis dato (sträflicherweise) nur ganz oberflächlich zu tun und wollte diese Wissenslücke by the way ansatzweise stopfen. Das Aufdröseln am konkreten Beispiel und eure Ergänzungen werden sicherlich einigen anderen Lesern auch ganz gut tun.
                            Und ist man alt wie ein Kuh, lernt man immer noch dazu.
                            THX, LOL, ROFL & Co. -> Netzjargon auf Wikipedia

                            Kommentar


                            • #15
                              Die regex ist doch nicht ganz so verkehrt. Neben lustlosen Standard-Schreibweisen, die abgewiesen werden konnten, war auch dieser Exot dabei, der abgeschossen wurde: V|a_g r-a

                              and that's all 4 today
                              Und ist man alt wie ein Kuh, lernt man immer noch dazu.
                              THX, LOL, ROFL & Co. -> Netzjargon auf Wikipedia

                              Kommentar

                              Lädt...
                              X