匹配是否含有敏感词三种方法

方法一:
/**敏感词过滤 (没有匹配到关键字就返回 false)
     * @param $content
     * @return bool
     */
    public static function sensitiveWord($content)
    {
        $fake = file_get_contents(public_path('sensitive/all.txt')); // 读取关键字文本信息 这个文本就是敏感词的文本网上都有 最好选择最新最全的
        $content = trim(trim($content), ','); //一定要去除左右空格  最好就是把所有特殊符号也去掉
        $fuckArr = explode("\n", $fake); // 把关键字转换为数组

        for ($i = 0; $i < count($fuckArr); $i++) {
            if ($fuckArr[$i] == "") {
                continue; //如果关键字为空就跳过本次循环
            }
//            dd($content, trim(trim($fuckArr[$i]),','));
            if (strpos($content, trim(trim($fuckArr[$i]), ',')) !== false) {
                $r = $fuckArr[$i]; //如果匹配到关键字就返回关键字
                return true;
            }
        }
        return false; // 如果没有匹配到关键字就返回 false
    }
/********敏感*词过滤************/
$vailTitle = ValueUtil::sensitiveWord($payload->getTitle());
if ($vailTitle) {
    throw new CustomErrorMessageException('标题含有敏感词');
}

敏感词链接:https://pan.baidu.com/s/1i1FepvCbIH1LuevmUZPWTQ 
提取码:yehw 
 

 

方法二:调用微信官方文档接口:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.msgSecCheck.html#method-http

 public static function get_access_token()
    {
        try {
            $access_token = \Cache::get('CACHE_UTIL_TOKEN');
            if (!$access_token) {
                $client = new \GuzzleHttp\Client();
                $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxx&secret=xxx';
                $response = $client->request('GET', $url);
                $result = $response->getBody()->getContents();
                $data = json_decode($result, true);
                \Log::info($data);
                $access_token = $data['access_token'];
                if ($access_token) {
                    \Cache::add("CACHE_UTIL_TOKEN", $access_token, 7200 / 60);
                } else {
                    \Cache::forget('CACHE_UTIL_TOKEN');
                    ValueUtil::get_access_token();
                }
            }
            return $access_token;
        } catch (\Throwable $exception) {
            \Log::error($exception);
        }

    }
控制器中调用获取token:
$content = '港独';
$token = ValueUtil::get_access_token();
$client = new \GuzzleHttp\Client();
$data = json_encode(['content' => $content], JSON_UNESCAPED_UNICODE);
$url = "https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" . $token;
$response = $client->request('POST', $url, [
        'body' => $data
    ]
);
$statusCode = $response->getStatusCode();
$result = $response->getBody()->getContents();
$data = json_decode($result, true);
return $data;

方法三EasyWechat文本安全内容检测

$app = Factory::miniProgram($config);
//$config 配置详见:https://www.easywechat.com/docs/master/mini-program/index
// 传入要检测的文本内容,长度不超过500K字节
$content = '你好';

$result = $app->content_security->checkText($content);
dd($result);
// 正常返回 0
{
    "errcode": "0",
    "errmsg": "ok"
}

//当 $content 内含有敏感信息,则返回 87014
{
    "errcode": 87014,
    "errmsg": "risky content"
}

 

 

 

 

 

 

### Spring Boot 和 Vue 中实现敏感词过滤的方法 #### 后端部分 (Spring Boot) 为了实现在 Spring Boot 应用程序中的敏感词过滤功能,可以创建自定义拦截器来处理入站 HTTP 请求并应用必要的过滤逻辑。 通过继承 `OncePerRequestFilter` 类,能够确保每次请求仅被该过滤器处理一次。对于 POST 请求携带的数据,则通常会使用 `@RequestBody` 注解绑定 JSON 数据到 Java 对象上,在此之前应该完成对这些数据的预处理工作[^1]。 另外一种有效的方式是利用前缀树(Trie Tree),这有助于提高查找效率特别是当敏感词库较大时。具体做法是在应用程序启动阶段加载位于 `/resources/sensitive-words.txt` 的敏感词列表,并构建相应的 Trie 结构用于后续快速匹配操作[^3]。 以下是基于上述思路的一个简单实现: ```java @Component public class SensitiveWordFilter extends OncePerRequestFilter { private static final Set<String> sensitiveWords = new HashSet<>(); @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { if ("POST".equalsIgnoreCase(request.getMethod())) { // 只针对POST请求做处理 String requestBody = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8); // 假设我们有一个方法 replaceSensitiveWords 来替换掉所有的敏感词 String filteredBody = replaceSensitiveWords(requestBody); MockHttpServletRequestWrapper wrapper = new MockHttpServletRequestWrapper(request){ @Override public ServletInputStream getInputStream() throws IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(filteredBody.getBytes(StandardCharsets.UTF_8)); return new DelegatingServletInputStream(byteArrayInputStream); } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(this.getInputStream())); } }; super.doFilterInternal(wrapper, response, filterChain); } else { super.doFilterInternal(request, response, filterChain); } } /** * 替换字符串中所有出现过的敏感词 */ private String replaceSensitiveWords(String content) { StringBuilder sb = new StringBuilder(content.length()); int start = 0; while (start < content.length()) { boolean found = false; for (String word : sensitiveWords) { if (content.startsWith(word, start)) { sb.append("*".repeat(Math.max(0, word.length()))); start += word.length(); found = true; break; } } if (!found) { sb.append(content.charAt(start++)); } } return sb.toString(); } } ``` 这段代码展示了如何编写一个简单的过滤器类 `SensitiveWordFilter` 并将其注册为组件以便自动生效于整个 Web 层面。注意这里的 `replaceSensitiveWords()` 函数只是一个非常基础的例子;实际生产环境中可能还需要考虑更多细节比如大小写不敏感比较、正则表达式的运用等。 #### 前端部分 (Vue.js) 在前端方面,可以通过监听表单提交事件或者直接修改 API 调用之前的参数来进行本地化的敏感词检测与提示给用户。下面是一个简化版的例子说明怎样在发送 AJAX 请求前执行这项任务: ```javascript // main.js 或者其他合适的地方引入全局混入 import axios from 'axios'; const instance = axios.create({ baseURL: '/api', }); instance.interceptors.request.use((config) => { const data = config.data; function checkAndReplace(text) { let resultText = text; const wordsToCheckAgainst = ['badword']; // 此处应替换成真实的敏感词数组 wordsToCheckAgainst.forEach(function(word) { var regExp = new RegExp(`\\b${word}\\b`, "gi"); resultText = resultText.replace(regExp, '*'.repeat(word.length)); }); return resultText; } if(typeof(data)==='string'){ config.data=checkAndReplace(data); }else{ Object.keys(data).forEach(key=>{ if(typeof(data[key])==='string'){ data[key]=checkAndReplace(data[key]); } }); } return config; }, error => Promise.reject(error)); export default instance; ``` 在此基础上还可以进一步优化用户体验,例如给出更友好的错误消息而不是仅仅隐藏敏感内容,或是提供即时反馈让用户知道哪些词语存在问题等等[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值