PHP Laravel, böse Wörter aussortieren

LordAnnie

Newbie
Dabei seit
Feb. 2020
Beiträge
6
Hallo,
folgende Situation:

Ich habe ein Textfeld namens "tags", wo ich mehrere tags reinschreibe getrennt durch ein ",".

z.b: Haus, Auto, Garten, Porn, Tiere

Ich habe eine Tabelle namens tags, mit folgenden Spalten: id, banned_tags, created_at, updated_at, die beinhalten folgende Einträge

id --------- banned_tags ---------
1 --------- asshole
2 --------- porn

Nun möchte ich das jedes eizelne Wort geprüft wird ob es in der banned_tags existiert

Habe ganze Nacht herumprobiert, mein Letzter Versuch sieht wie folgt aus:

PHP:
$loadData = Tag::select(['banned_tags'])
            ->orderBy('id', 'desc')
            ->get()
            ->toArray();

        $badwords = explode(',', $request->tags);

        $check = in_array($badwords, $loadData);

        if (count($check) > 0) {
            return 'tag is banned';
        }else {
            return 'not banned';
        }
 
Zuletzt bearbeitet:

benneq

Admiral
Dabei seit
Juli 2010
Beiträge
9.323
Bei deinem Beispiel oben gibt's noch Leerzeichen. Evtl. musst du deine Strings vorher noch trimmen.
Dann kommt noch dazu, dass dein Vergleich vermutlich nicht case sensitive sein sollte.

Und bei in_array bin ich mir nicht sicher, ob man ein Array als Needle benutzen kann. Aber da kennt sich sicherlich jemand besser mit aus.
 

coolmodi

Lt. Commander
Dabei seit
Apr. 2012
Beiträge
1.924
Was geht denn nicht? Was ich direkt sehe:

in_array() gibt doch ein boolean zurück, kein array. Weiterhin kannst du da glaube ich kein array als "Suchbegriff" verwenden, array_diff() könnte helfen.
count() gibt immer 1 zurück, falls der Parameter kein array oder countable ist.
explode(',', $request->tags); entfernt keine Leerzeichen (vor/nach den Kommas). trim() würde da noch helfen.
 

LordAnnie

Newbie
Ersteller dieses Themas
Dabei seit
Feb. 2020
Beiträge
6
habe es nun endlich hinbekommen, keine ahnung ob es eleganter zu lösen geht, aber es funktioniert

PHP:
// tags check 

$userInput = trim($request->tags);   

$replaceInput = str_replace(" ", "", $userInput);   

explodeTags = explode(',', $replaceInput);   



$result = DB::table('tags')     

->whereIn('banned_tags', $explodeTags)     

->get();   



if (count($result) > 0) {     

return 'tag is banned'; 

}
 

Andreas_

Commander
Dabei seit
Jan. 2017
Beiträge
2.078
Dir ist schon klar, dass Du nicht der erste bist, der eine Lösung für das Problem sucht?
Schau Dir mal https://github.com/snipe/banbuilder oder https://github.com/ConsoleTVs/Profanity an. Du wirst feststellen dass bei Deinen Überlegungen noch einiges fehlt, z.B. Abwandlungen wie 4ssh0le oder a.s.s.h.o.l.e oder der Austausch einzelner Buchstaben durch zum Verwechseln ähnlich aussehende Buchstaben ...
 

abcddcba

Lt. Commander
Dabei seit
Juni 2018
Beiträge
1.927
Korrekt, gibt's genug NLPler und Linguisten, die sich mit Phonetischem Matching, leetspeak und was auch immer alles beschäftigen. Gibt halt weit mehr als nur "exact match" und heutzutage mit dem wirren Slang im Internet wird es eher mehr als weniger.
 

LordAnnie

Newbie
Ersteller dieses Themas
Dabei seit
Feb. 2020
Beiträge
6
Dir ist schon klar, dass Du nicht der erste bist, der eine Lösung für das Problem sucht?
Schau Dir mal https://github.com/snipe/banbuilder oder https://github.com/ConsoleTVs/Profanity an. Du wirst feststellen dass bei Deinen Überlegungen noch einiges fehlt, z.B. Abwandlungen wie 4ssh0le oder a.s.s.h.o.l.e oder der Austausch einzelner Buchstaben durch zum Verwechseln ähnlich aussehende Buchstaben ...
Danke für den Link, sehr Interessant... habe das gar nicht bedacht mit denn Umwandlungen....
 
Top