在日常的 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、支持中文分词识别、或者整合数据库管理词库等,让它变得更智能、更强大!
希望这篇文章对你有所启发!如果你有更酷的实现方式,也欢迎分享~