當前位置: 首頁> 最新文章列表> 如何使用stripos 和回調函數構建一個簡單又實用的自定義過濾器?

如何使用stripos 和回調函數構建一個簡單又實用的自定義過濾器?

M66 2025-05-31

在日常的Web 開發中,我們經常會遇到需要對用戶輸入的內容進行“過濾”的需求,特別是在處理評論、論壇發帖等場景時,為了避免敏感詞、廣告鏈接或者不當言論傳播,構建一個“自定義過濾器”就顯得尤為重要。

在本文中,我們將利用PHP 中的stripos()函數和回調函數,搭建一個簡單卻非常實用的敏感詞過濾器。整個思路清晰明了,即便是新手也能輕鬆上手。

什麼是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、支持中文分詞識別、或者整合數據庫管理詞庫等,讓它變得更智能、更強大!

希望這篇文章對你有所啟發!如果你有更酷的實現方式,也歡迎分享~