badword list vergleichen php



  • Hallo,

    ja meine probleme sind gross 😃 .

    Ich möchte meine Shoutbox mit eine badword list versehen

    die badword liste soll so aussehen (als .txt)

    Verboten
    milch ist auch nicht erlaubt
    sonstige
    

    Der code soll beim string "_sonstige_" auch als verboten gezeichnet werden oder
    Beim string mit leer zeichen soll er auch reagieren

    wie setzte ich das um?

    falls code von der shoutbox benötigt wird poste ich den gerne auf anfrage

    mfg

    p.s. ich dachte irgendwie mit substring() bin mir allerdings nicht ganz sicher



  • Hallo,

    ein paar Stichworte:
    - file
    - strpos
    - str_replace
    - preg_match / preg_replace

    Du siehst es gibt viele Ansätze. Schau sie dir einfach mal an. Interessant sind alle.

    VlG



  • hallo,

    ich habe mir schon fast gedacht das du mir antworten würdest...

    aber zurück zum Thema

    was würdest du den empfehlen welches wäre am schnellsten und ist dennoch sehr effizient?

    mfg

    p.s. auch schau mir die Stichwörter dennnoch an!



  • Hallo,

    ich würde wohl auf preg_replace zurückgreifen. Ist nicht unbedingt der einfachste Weg, aber dafür der mit den meisten Möglichkeiten. Reguläre Ausdrücke sind schon was schönes 😃

    An "file" geht wohl kein Weg dran vorbei, wenn du das ganze Dateibasiert machen möchtest.

    VlG



  • Ich werde mir das mal ansehen,
    ich mein ich kann ja auch eine if abfrage machen ob der string ein wort davon beinhaltet den wäre das ja nicht mehr "file" basiert oder?

    ich muss ehh noch an dem shoutbox code arbeiten

    da ist kein .mysql_real_escape_string() drinne
    und er prüft denn inhalt gar nicht sondern trägt alles 1:1 in die db

    also erstmal weiterarbeiten...

    mfg



  • Hallo,

    jenachdem wo du die Liste mit den Wörtern ablegst. Ich würde mir ein Array machen und dort auch gleich die Replacer reinschreiben:

    $badwords = ARRAY("verbotenesWort"        => "netteresWort", 
                      "nocheinverbotenesWort" => "nocheinnetteresWort"); //usw.
    
    foreach($badwords as $badword => $value)
    {
       $text = preg_replace("/" $badword . "/i", $value, $text);
    }
    

    Alternative file (Dateibezogen):

    Die Datei.txt schrieb:

    verbotenesWort;ersetzung
    nocheinverbotenesWort;ersetzung

    $file = file('test.txt', FILE_SKIP_EMPTY_LINES);
    
    foreach($file as $nl)
    {
      $line = explode(";", $nl);
      $text = preg_replace("/" . $line[0] . "/i", $line[1], $text);
    }
    

    Die regulären Ausdrücke kann man natürlich auch direkt in das Array oder die Datei schreiben, dann wird es je nach Wort etwas dynamischer.

    VlG



  • hallo,

    also das erste beispiel find ich gar nicht mal so schlecht alles einfach in einem array schreiben das klingt gut 😃

    mfg


  • Mod

    str_replace statt preg_replace
    wo sollen bei einer wortliste denn regex vorkommen?



  • regex ist super für sowas 😋



  • axo ja das hab ich vergessen 😡



  • Shade Of Mine schrieb:

    str_replace statt preg_replace
    wo sollen bei einer wortliste denn regex vorkommen?

    Und damit jede mögliche Tür zu machen?
    str_replace ist case sensitiv .. Da gehts dann schon los.

    VlG


  • Mod

    RandomAccess85 schrieb:

    Shade Of Mine schrieb:

    str_replace statt preg_replace
    wo sollen bei einer wortliste denn regex vorkommen?

    Und damit jede mögliche Tür zu machen?
    str_replace ist case sensitiv .. Da gehts dann schon los.

    OK, dann str_ireplace.

    Was für Türen denn bitte? Blacklisten sind vom Konzept her schon eine offene Tür.



  • Und was machst du in dem fall:

    Badword: @rsch // hier mit @ weil der Foren-BWF @rsch mit "a" filtert
    Replacer: Hintern

    Suchtext: "ich spiele einen Marsch"

    str_(i)replace macht dann: "ich spiele einen MHintern" daraus. Na ganz toller Badwordfilter.

    VlG


  • Mod

    RandomAccess85 schrieb:

    Und was machst du in dem fall:

    Badword: @rsch // hier mit @ weil der Foren-BWF @rsch mit "a" filtert
    Replacer: Hintern

    Suchtext: "ich spiele einen Marsch"

    str_(i)replace macht dann: "ich spiele einen MHintern" daraus. Na ganz toller Badwordfilter.

    Garnichts. Blacklisten funktionieren nicht. Der Normale Ansatz ist vor dem checken den Text zu "de-leeten" also @ nach a, $ nach s, etc. umzuwandeln. Aber was willst du da wirklich machen? Etwa folgende regex?
    /[a@4](r|\/|2)[s$][c<\(][hb4]/i
    verwenden?
    dann schreib ich einfach ársch und hab dich wieder ausgetrickst.

    Blacklisten funktionieren nicht. Die Standard Lösung ist eine Liste mit str_ireplace brutal zu ersetzen. Aber das funktioniert nicht. Denn badwords können legale Teile von ganzen Wörtern sein. Beispiel "classical" hat "ass" drinnen. Man kann aber nicht nur auf \b matchen weil dann zB ja zB arsch Teil von riesenarsch ist. Du hast also per Definition schon verloren.

    Deshalb macht man es idR so: du hast eine blackword liste und eine whiteword liste. Die blackwords sind zB ass und das white word ist classical. Du ersetzt jetzt ass überall durch *** und dann cl***ical durch classical, oder eben sicherst vorher alle whitewords raus.

    regex sind ungemein praktisch, bringen hier aber nicht wirklich etwas. stören aber bei langen blackwords listen... (von dem Problem dass die blackword listen dann ja auch komplexer zu verwalten sind mal abgesehen). Aber bitte: welchen direkten Vorteil siehst du hier von regex?



  • Shade Of Mine schrieb:

    Aber bitte: welchen direkten Vorteil siehst du hier von regex?

    das ist als würdest du fragen wofür soundex o.ä. verwendet werden, natürlich sind regexes viel mächtiger aber eben auch langsamer und daher für größere wortlisten eher ungünstig 😞



  • Ich sag nix mehr 🙄
    Großmeister Shade Of Irgendwas weiß es doch eh immer besser 🙄

    Bye Bye


  • Mod

    regexer schrieb:

    Shade Of Mine schrieb:

    Aber bitte: welchen direkten Vorteil siehst du hier von regex?

    das ist als würdest du fragen wofür soundex o.ä. verwendet werden, natürlich sind regexes viel mächtiger aber eben auch langsamer und daher für größere wortlisten eher ungünstig 😞

    Nenn mir einen Vorteil von regex. Einen Vorteil von soundex sehe ich.

    Das Problem ist: es geht um string manipulation und plötzlich denken alle: JA, da benutz ich regex. Die bringen hier aber keinen Vorteil, wohl aber einen Nachteil. Pack mal sh.t auf die badwords list. und plötzlich hast du shot auch zensiert. Ist halt gefährlich da du die Wartung der blackwords und whitewords technisch unerfahrenen Leuten geben willst.

    soundex ist halt lahm, aber natürlich kann es sinnvoll sein. In diesem Fall würde man mit preg_explode den eingabe Text in Teile zerlegen und dort überall soundex oder dergleichen drüber laufen lassen. So macht man das ja bei den Suchfunktionen. Je nachdem wie lange der Text ist, ist das aber wohl eine eher schlechtere Idee.

    Aber wie gesagt: das Problem ist das Konzept der blacklist. Man braucht dazu eine Whitelist (die macht das Problem aber auch nicht weg, sondern verringert es nur etwas). Blacklists sind immer nur ein zusätzliches Hilfetool, nie selber die Lösung.

    @RandomAccess85:
    Es ist ein interessantes Thema. Da kann man schön darüber diskutieren. Zähl einfach mal die Vorteile von regex hier auf. zB könntest du argumentieren dass man mit regex ja schön nur einzelne Wörter matchen kann, dank \b - was meine Methode ja nicht kann. Nur müsstest du dann noch ein Argument gegen zusammengesetzte schimpfwörter finden -> zB dass man diese eben auch eintragen muss. Oder dass man zB immer nur am Anfang des Wortes matchen könnte um so arschloch zu fangen aber marsch in ruhe zu lassen...

    Ist ein sehr spannendes Thema und es gibt keine wirklich gute Lösung dafür. Es wäre ziemlich super wenn wir hier eine ideallösungen finden würden.



  • Ich muss nicht mit dir über reguläre Ausdrücke diskutieren wenn der Thread-Ersteller wissen wollte wie man schnell und effizient einen BWF basteln kann. Dann mach ein seperates Thema auf (Herr Moderator) und diskutier dort, wenn du es unbedingt willst.

    VlG



  • Ich werde wohl nie verstehen, wo nun der Unterschied liegt, ob da nun Arschloch steht oder ********* und jeder weiß, was gemeint ist. Wozu der ganze Affenkram?


  • Mod

    RandomAccess85 schrieb:

    Ich muss nicht mit dir über reguläre Ausdrücke diskutieren wenn der Thread-Ersteller wissen wollte wie man schnell und effizient einen BWF basteln kann. Dann mach ein seperates Thema auf (Herr Moderator) und diskutier dort, wenn du es unbedingt willst.

    Dieser Thread ist genau der Richtige um darüber zu diskutieren.
    Du wirkst auf mich leicht beleidigt. Falls ich dich beleidigt haben sollte tut es mir leid, das war nie meine Absicht.

    Aber ich denke schon dass es sinnvoll ist hier auf die unsinnigkeit von Blacklisten hinzuweisen um die Limitierungen der Implementierung aufzuzeigen. Und im gleichen Zug auch eine verbesserte Variante anzubieten.



  • Hallo,

    na gut! Ich weiß nicht was an Blacklisten in Form von Badwordfiltern unsinnig ist. Marc++us macht es auch (wobei es in dem Fall wirklich unsinnig ist, weil er Rechtschreibfehler zensiert). Ich für meinen Teil lasse mich in Chats oder Foren oder Shoutboxen nur ungern beleidigen und empfinde es dann eher als belustigend wenn anstelle von "Arschloch" irgendetwas anderen blödes kommt.
    Zudem spielen noch ganz andere Faktoren eine Rolle - Jugendschutz & Verfassungsschutz (nur um mal zwei Beispiele zu nennen).
    Schreibt jemand 88 (ausgeschrieben (muss ich sicher nicht weiter darauf eingehen)) haftet nicht der der geschrieben hat, sondern der, der ermöglicht hat, dass es geschrieben werden konnte.

    Zensur in geringem Maße halte ich für vollkommen ok und auch angemessen.

    Technisch gesehen wüsste ich jetzt keine andere Möglichkeit außer mittels replace-Methoden zu filtern. Welche der vielen Methoden man nutzt ist sicher Ansichtssache und auch Sache des Verwendung. Manch einer filtern nur ganze Worte, andere filtern Sätze, wieder andere filtern Bestandteile aus einem oder beidem und die vierten wollen den absoluten Schutz und filtern sogar die bösen Worte in falscher Schreibweise. Manchmal auch nicht unklug wenn ich an den Stress denke, den Ex-Lycos mal wegen nur schlecht gepflegten Filtern hatte.

    Auf die bessere Variante bin ich nun sehr gespannt. Gänzlich auf solche Listen zu verzichten ist es auf jeden Fall nicht.

    VlG


Anmelden zum Antworten