当前位置: 首页> 最新文章列表> 使用 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、支持中文分词识别、或者整合数据库管理词库等,让它变得更智能、更强大!

希望这篇文章对你有所启发!如果你有更酷的实现方式,也欢迎分享~