简介
在开发 Web 应用时,我们经常需要处理一些用户输入数据,例如评论、留言等,很多时候这些用户输入数据存在敏感词,我们需要进行过滤,本文介绍了一个针对敏感词过滤的 npm 包 @sophek/use-filter-words,我们将会详细介绍它的安装、使用、原理以及相关的注意事项。
安装
在使用 @sophek/use-filter-words 之前,你需要先安装它:
npm install @sophek/use-filter-words --save
使用
安装成功之后,我们就可以在我们的项目中使用它了。使用的方法有两种:
在 React 函数组件中使用(hooks)
import useFilterWords from '@sophek/use-filter-words'; function Comment(props) { const { content } = props; const filteredContent = useFilterWords({ content }); return <div>{filteredContent}</div>; }
直接使用过滤函数
import { filterWords } from '@sophek/use-filter-words'; const content = '你太 niubi 了!'; const filteredContent = filterWords(content); // 过滤后:你太 ** 了!
原理
@sophek/use-filter-words 的原理是通过构建一个 DFA(Deterministic Finite Automaton,确定性有限状态自动机)来进行敏感词过滤。
我们知道,敏感词是由若干个非法字符组成,我们需要一个不断匹配输入文本的过程,直到找到所有的非法字符,并把它们替换掉。一般的匹配过程是按照非法字符的长度,从输入文本的起始位置开始匹配,这个过程很费时间,如果有大量的非法字符需要匹配,效率就会变得很低。
而通过 DFA 来过滤敏感词,我们可以将非法字符按照前缀树的结构组织起来,这样匹配就可以 O(n) 完成,效率非常高。因此,@sophek/use-filter-words 在匹配过程中,会先将所有敏感词按前缀树的方式组织起来,接下来的匹配过程就可以 O(n) 完成。
注意事项
- 由于 @sophek/use-filter-words 的过滤结果是 string 类型,因此你需要处理好样式等相关问题。
- 你需要在你的项目中提供敏感词列表,这个列表需要是一个数组,包含所有需要过滤的敏感词。
- 由于过滤逻辑需要构建前缀树,因此如果敏感词列表很大,可能会导致构建过程耗费较长时间。
- 在使用 @sophek/use-filter-words 过滤敏感词的时候,你需要保证数据的隐私,这个包内置了一个包含常见的敏感词的数组,你可以直接使用它,但不建议传入用户输入的文本,因为这样会降低敏感词的过滤效果。
示例代码
下面提供一段 React 组件代码作为使用示例:
-- -------------------- ---- ------- ------ ----- ---- -------- ------ -------------- ---- --------------------------- ----- ----- - ---------- ----- ---------------------- - ----------------------------- -------- -------------- - ----- - ------- - - ------ ----- --------------- - ---------------- ------- --- ------ - ---- ------------------ ---- ----------------------------- ---------------------------- ----------------- ------ ------ -- - ------ ------- --------
在这个例子中,我们创建了一个 Comment 组件用于显示评论,通过调用 useFilterWords 来过滤评论内容,并用 CSS 将过滤结果渲染成一种特殊的样式。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600671d730d0927023822e10