badword list vergleichen php
-
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 dbalso 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
-
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
-
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: HinternSuchtext: "ich spiele einen Marsch"
str_(i)replace macht dann: "ich spiele einen MHintern" daraus. Na ganz toller Badwordfilter.
VlG
-
RandomAccess85 schrieb:
Und was machst du in dem fall:
Badword: @rsch // hier mit @ weil der Foren-BWF @rsch mit "a" filtert
Replacer: HinternSuchtext: "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 besserBye Bye
-
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?
-
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
-
Beleidigungen kann man nicht zensieren. Es gibt auch kein System das das irgendwie gut machen wuerde. Oft wird es aber natuerlich vom Kunden verlangt - dann muss man so ein System eben einbauen. Nur muss einem klar sein, dass man damit nur den Kunden befriedigt aber nicht Beleidigungen unterbindet.
Wenn zB arsch zensiert ist, dann gibt es 2 Moeglickeiten: ich kann nicht marsch schreiben oder ich kann arschloch schreiben. Beides abfangen ist nicht moeglich. Und dabei sind die Beleidigungen noch komplett unkreativ.
Deshalb braucht man eine whitelist dazu, um eben marsch zu erlauben und arschloch dennoch zu zensieren.
Ein simples System das ganz OK funktioniert waere zB:
$content = 'some content'; $blacklist = file('blacklist.txt'); foreach($blacklist as $word) { $content = str_ireplace($word,str_repeat('*', strlen($word)), $content); } $whitelist = file('whitelist.txt'); foreach($whitelist as $line) { list($word, $replace) = explode(';',$line); $content = str_ireplace($word, $replace, $content); }
Dadurch kann man in whitelist.txt zB m***** reinschreiben (bzw. man schreibt marsch rein und laesst automatisch zensieren) und es wieder in marsch zurueck wandeln.
Je nachdem was man will wird es komplexer.
Aber jedes System laesst sich trivial austricksen. Dieses hier zB dadurch dass man ar$ch schreibt. oder dergleichen.
Hier gibt es nur die Moeglichkeit zu de-leeten. Also alle $ in s umwandeln, sich die Position merken, dann zensieren und dann wieder zurueck wandeln. Aber das steigert die Komplexitaet eben wieder. Hier waere es sogar wirklich besser mit regex zu arbeiten, indem aus arsch naemlich wirklich
[a@4](r|\/|2)[s$][c<\(][hb4]
wird. Automatisch natuerlich.Aber alle Schreibweisen kann man so leider auch nicht abfangen. Und auch nicht alle Schimpfworte die auf einen Kontext basieren. zB behindert. Das kann als Schmipfwort benutzt werden, darf aber nie zensiert werden.
Die Rechtschreibzensur hat hier zB damit angefangen dass arsch in wahrscheinlich ohne h eben zensiert wurde. Das war lustig und der Anfang des ganzen.
Deshalb sind whitelists essentiell. Oder aber man zensiert nur das Wort wenn es alleine steht - was zwar deutlich weniger Sinn macht (dennoch oft dem Kunden reicht).
Ein anderer Ansatz ist natuerlich mit einem Art spamfilter die anstoessigen Texte zu filtern. Ist aber noch eine Stufe komplexer und funktioniert auch nicht einwandfrei.
Deshalb: solange es der Kunde nicht explizit verlangt wuerde ich nicht automatisch zensieren. Wenn es notwendig ist, wuerde ich mit einer blacklist/whitelist zensieren und die gaengigsten Abwandlungen der Schimpfworte auch auf die Blacklist setzen. Aber das ist ein Kampf den man von vornherein verloren hat - da die Besucher immer einen Weg finden daran vorbei zu kommen.
Meistens ist es effektiver zu loeschen und mit einem Besucher-koennen-Posts-melden-System zu arbeiten.