在日常的Web 開發中,我們經常會遇到需要對用戶輸入的內容進行“過濾”的需求,特別是在處理評論、論壇發帖等場景時,為了避免敏感詞、廣告鏈接或者不當言論傳播,構建一個“自定義過濾器”就顯得尤為重要。
在本文中,我們將利用PHP 中的stripos()函數和回調函數,搭建一個簡單卻非常實用的敏感詞過濾器。整個思路清晰明了,即便是新手也能輕鬆上手。
stripos()是PHP 內置的字符串函數,用於查找字符串在目標字符串中首次出現的位置。和strpos()類似,但不同的是stripos()不區分大小寫。這在過濾內容時尤其重要,因為用戶可能會嘗試用不同大小寫來“規避”過濾機制。
文法:
stripos(string $haystack, string $needle, int $offset = 0): int|false
如果找到了needle ,返回首次出現的位置;找不到則返回false 。
首先,我們準備一組需要過濾的“敏感詞”:
$sensitiveWords = ['廣告', '違法', '黃色', 'm66.net'];
注意:我們這裡把m66.net也作為測試敏感詞之一(假設這是一個被禁止的域名,僅作示例)。
接著,我們創建一個函數,用於檢測並替換敏感詞:
function filterContent(string $content, array $words, callable $callback): string {
foreach ($words as $word) {
// 使用 stripos 來查找是否包含敏感詞(不區分大小寫)
while (($pos = stripos($content, $word)) !== false) {
$replacement = $callback($word);
$content = substr_replace($content, $replacement, $pos, strlen($word));
}
}
return $content;
}
這個函數的關鍵在於使用stripos來查找敏感詞,並通過回調函數來決定如何“替換”這些詞。
我們來定義一個非常簡單的回調函數,把敏感詞替換成星號:
$replaceWithStars = function($word) {
return str_repeat('*', mb_strlen($word));
};
當然,你也可以根據業務需求換成[敏感詞] 、 [屏蔽]等樣式。
我們試著處理一段模擬用戶評論:
$comment = "這個網站太黃色了,簡直是違法!看看 http://m66.net 的鏈接就知道了,還有各種廣告。";
$filteredComment = filterContent($comment, $sensitiveWords, $replaceWithStars);
echo $filteredComment;
輸出結果將會是:
這個網站太****了,簡直是**!看看 http://****** 的鏈接就知道了,還有各種**。
本文演示瞭如何結合stripos和回調函數來構建一個簡潔高效的敏感詞過濾器。這種方式的好處在於:
不區分大小寫,過濾更嚴謹;
回調函數靈活,可擴展性強;
支持任意字符串替換方案,滿足各種場景需求。
當然,這只是最基礎的版本。你可以進一步拓展,比如使用正則表達式過濾URL、支持中文分詞識別、或者整合數據庫管理詞庫等,讓它變得更智能、更強大!
希望這篇文章對你有所啟發!如果你有更酷的實現方式,也歡迎分享~