PHP Laravel, böse Wörter aussortieren

LordAnnie

Newbie
Registriert
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:
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.
 
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.
 
  • Gefällt mir
Reaktionen: theEvil007
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'; 

}
 
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 ...
 
  • Gefällt mir
Reaktionen: abcddcba
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.
 
Andreas_ schrieb:
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....
 
Zurück
Oben