我想检查用户提交的帖子中是否包含禁止词集合中的任何词。
$post = Post::create($request->validated());
$word = Word::select('word')->get();
我想检查post是否包含$ words集合中的任何单词。
contains方法会起作用吗? https://laravel.com/docs/5.3/collections#method-contains
答案 0 :(得分:1)
我建议为此使用已制成的库,例如Crudle\Profanity
:
use Crudle\Profanity\Filter;
use Crudle\Profanity\Dictionary\GB;
$filter = new Filter(new GB);
// Clean a string
$filter->cleanse('Joe is a little bitch'); // Returns 'Joe is a little *****'
// Clean a string with a custom censor character
$filter->cleanse('Joe is a little bitch', 'x'); // Returns 'Joe is a little xxxxx'
// Check if a string is dirty
$filter->isDirty('Joe is a little bitch'); // Returns true
答案 1 :(得分:0)
在纯PHP中,
if(preg_match('/\b('.implode('|', $words).')\b/i', $input))
您可能还想做
$words = array_map(function($word){ return preg_quote($word,'/'); }, $words);
对于正则表达式而言,这将逃避任何重要的事情。
在正则表达式中,\b
是一个单词边界,而|
是一个字边界,因此对于模式,您可以使用i
标志不区分大小写。
/\b(word1|word2)\b/i
基本上,捕获带有单词边界的单词1或单词2(如果匹配)。