我如何检查用户提交的帖子中是否包含被禁止的单词中的一个单词

时间:2019-02-19 09:10:41

标签: php laravel

我想检查用户提交的帖子中是否包含禁止词集合中的任何词。

$post = Post::create($request->validated());
$word = Word::select('word')->get();

我想检查post是否包含$ words集合中的任何单词。

contains方法会起作用吗? https://laravel.com/docs/5.3/collections#method-contains

2 个答案:

答案 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(如果匹配)。

Test it