基于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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
WordPress中獲取頁面鏈接和標題的相關PHP函數用法解析
這篇文章主要介紹了WordPress中獲取頁面鏈接和標題的相關PHP函數用法解析,分別為get_permalink()和wp_title()函數的使用,需要的朋友可以參考下2015-12-12php中配置文件操作 如config.php文件的讀取修改等操作
對形如config.php文件的讀取,修改等操作的代碼,需要的朋友可以參考下2012-07-07