sydante / laravel-sensitive
敏感词检查及过滤扩展包,采用 DFA 算法;可配置使用缓存,减少运行时 IO 占用;支持任意框架
Installs: 1 138
Dependents: 0
Suggesters: 0
Security: 0
Stars: 18
Watchers: 1
Forks: 4
Open Issues: 3
Requires
- php: >=7.1
- ext-mbstring: *
Requires (Dev)
- orchestra/testbench: ^5.5
- phpunit/phpunit: ^9.3
This package is auto-updated.
Last update: 2024-12-17 09:18:00 UTC
README
敏感词检查及过滤扩展包
特点
- 采用 DFA 算法
- 可配置使用缓存,减少重复构建敏感词库集合,减少资源占用
- 支持非 Laravel 框架(不使用缓存功能,或者自定义缓存类)
- 可通过配置文件管理配置,也可动态修改配置
- 使用缓存时,修改配置后可通过命令行更新缓存
- 使用 Facade 时,IDE 也能完美提示
系统要求
- php 7.1 及以上版本
- mbstring 扩展
- composer
安装
通过 composer 安装
composer require sydante/laravel-sensitive
初始
Laravel
Laravel 使用包自动发现,所以不需要手动添加服务提供器
如果你没有使用自动发现,就必须手动添加服务提供器到 config/app.php
的 providers 数组中:
'providers' => [ //... Sydante\LaravelSensitive\ServiceProvider::class, ],
如果你想使用 facade,添加如下代码到 config/app.php
的 aliases 数组中:
'aliases' => [ //... 'Sensitive' => Sydante\LaravelSensitive\Facades\Sensitive::class, ],
添加配置
Laravel
在项目目录下,使用如下命令发布配置:
php artisan vendor:publish --provider="Sydante\LaravelSensitive\ServiceProvider"
之后可以在 .env
中设置 SENSITIVE_CACHE
为 true
来开启缓存功能
其他框架
可在实例化 Sydante\LaravelSensitive\Sensitive
时自行传入配置
更新缓存
在使用缓存时,如果修改了敏感词配置 words
或 file
或者修改了 file
配置的文件的内容时,需要通过如下命令更新缓存:
如果缓存了配置,需先更新配置缓存:
php artisan config:cache
# 更新缓存
php artisan sensitive:cache
也可清理缓存,缓存被清理后,在下次被使用时会根据配置自动重建缓存
php artisan sensitive:clear
使用
示例代码
// Laravel 可直接通过如下方式获取实例 $sensitive = app(Sydante\LaravelSensitive\Sensitive::class); $sensitive->filter('这是一个示例'); // 或者使用 Facade \Sydante\LaravelSensitive\Facades\Sensitive::filter('这是一个示例'); // 其他骚操作: // 1、动态修改敏感词,并在使用缓存时缓存 $sensitive->emptyTrieTreeMap() ->addWords(['test']) ->saveTrieTreeMap(); // 2、重置敏感词为初始化时的默认设置,并在使用缓存时缓存 $sensitive->resetTrieTreeMap() ->saveTrieTreeMap();
可用方法包括:
replaceCode(string $replaceCode): self
设置替换字符串setDisturbs(array $disturbList = []): self
设置干扰因子saveTrieTreeMap(): bool
如果使用缓存的话,保存当前敏感词库集合到缓存中resetTrieTreeMap(): self
使用配置中的设置重置当前的敏感词库集合emptyTrieTreeMap(): self
清空敏感词库集合clearCache(): bool
清理敏感词库集合缓存addWords(array $wordsList): self
添加敏感词addWordsFromFile(string $filename): self
从文件中读取并添加敏感词filter(string $text): string
过滤敏感词search(string $text): array
查找对应敏感词
在其他框架中使用
不使用缓存
在不使用缓存时,可以直接在其他框架中直接使用 Sydante\LaravelSensitive\Sensitive
。
使用缓存
如果需要使用缓存功能,请自行编写实现了 Sydante\LaravelSensitive\SensitiveCacheInterface
接口的缓存类,在初始化 implements SensitiveCacheInterface
时传入类名到 cache_class
键中:
use Sydante\LaravelSensitive\Sensitive; use Sydante\LaravelSensitive\SensitiveCacheInterface; // 编写自定义的缓存类 class CustomSensitiveCache implements SensitiveCacheInterface { // ... } // 使用 $sensitive = new Sensitive([ 'cache' => true, 'words' => ['test'], // 使用自定义缓存类 'cache_class' => CustomSensitiveCache::class, ]); $sensitive->filter('我们来一个test'); // 我们来一个****
为什么要写这个包
在写这个包之前,我使用的是 yankewei/laravel-sensitive,在此感谢此包提供的敏感词处理思路。不过在实际使用中,压测发现此包 IO 占用太高,且函数调用频繁:
遂打算自己重写,将生成的敏感词库集合缓存起来,优化掉读敏感词文件和生成敏感词集合的部分,一次生成,即可重复使用。
Tips
可使用如下方式,来使干扰因子支持使用 SENSITIVE_DISTURBS
配置
// in config/sensitive.php // 获取设置的干扰因子 $disturbs = env('SENSITIVE_DISTURBS'); if ($disturbs !== null) { // 将干扰因子解析成单个字符的列表 $disturbs = array_values(array_unique( preg_split('//u', $disturbs) )); } return [ // 是否使用缓存,默认 false 'cache' => env('SENSITIVE_CACHE', false), // 干扰因子列表 'disturbs' => $disturbs, // ... ];
如果缓存了配置,调整了
SENSITIVE_DISTURBS
后需要更新配置缓存:php artisan config:cache