欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于PHP實現敏感詞過濾功能

 更新時間:2023年10月27日 10:06:46   作者:小柳666  
后端同學在做一些社區(qū)論壇類型項目時候,可能會繞不開敏感詞的過濾這個功能,特別是在微信小程序中,如果主營類目被定義為【社交】 那么敏感詞、圖片、視頻的各種過濾功能是逃不掉的,否則是無法上線的,下面就以PHP代碼為例,分析一下這個功能的具體實現

需求分析

既然是敏感詞過濾,那么肯定是需要有一張敏感詞的數據表的。

大概就是上面這個樣子。

思路一

剛拿到需求我的第一實現思路就是,當獲取到用戶提交的評論內容以后,把數據庫中的每一個屏蔽詞都用正則去匹配一下。如果匹配到數據,那么就把匹配到的問題替換成 ** ,最后就把原文跟匹配完成的文字進行存儲即可。大體的代碼可能是下面這個樣子。

    $str = '我愛中國,我是賣qiang的,請與我聯(lián)系';
    $pattern = '/賣qiang/i';
    $replacement = '**';
    echo preg_replace($pattern,$replacement,$str);

    //  輸出  我愛中國,我是**的,請與我聯(lián)系

上面的代碼是正確的,但是假如屏蔽詞的數量有幾千條,那么每一個詞都需要跟待匹配的文字匹配一遍,那就是幾千次,程序的執(zhí)行效率太差。

思路二 一次匹配多個詞

既然一次匹配一個詞效率太低,那可以嘗試一次匹配多個詞。大致修改的代碼是下面這個樣子。

    $str = '我愛中國,我是賣qiang的,請與我聯(lián)系';
    $pattern = '/賣qiang|與我|非法|動物|系/i';    //這里會追加很多個詞
    $replacement = '**';
    echo preg_replace($pattern,$replacement,$str);

    //  我愛中國,我是**的,請**聯(lián)**

這樣的話,幾千個屏蔽詞組成一個正則。匹配一次就可以完成字符串的替換。但是假如屏蔽詞的數量有十萬,那正則的這個變量肯定超出內存報錯了。這種情況下就需要分組進行處理數據了。

$str = '我愛中國,我是賣qiang的,請與我聯(lián)系';
$block_arr = ['1','2','3',...,'100000'];
$sm_list = array_chunk($block_list, 1000);
foreach ($sm_list as $key => $value) {
    $pattern = "/" . implode("|",  array_column($list, 'word')) . "/i";    //這里會追加很多個詞
    $replacement = '**';
    $str = preg_replace($pattern,$replacement,$str);
}
echo $str;

//  我愛中國,我是**的,請**聯(lián)**

上面的代碼中,我們將一個無比巨大的數組,以1000為單位進行拆分。然后批量的去替換掉目標數據中可能存在的敏感詞。這樣就完成了敏感詞的過濾功能。

優(yōu)化選項

  • 敏感詞是一次查詢,數據量多的情況下每次都會很耗費資源。所以我們是需要把查詢出來的敏感詞放到redis緩存之中的。
  • 敏感詞匹配中,要先匹配長的,然后采取匹配短的。sql語句的排序 ->orderRaw('LENGTH(word) desc')

到此這篇關于基于PHP實現敏感詞過濾功能的文章就介紹到這了,更多相關PHP敏感詞過濾內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論