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 reagierenwie 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_replaceDu 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 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.