Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
JS如何实现关键字过滤_创想鸟

JS如何实现关键字过滤

js实现关键字过滤的核心方法有四种:1. 循环替换,简单但性能差;2. 正则表达式一次性替换,效率较高但正则过长会影响性能;3. trie树,适合大词库,查找高效但实现复杂;4. aho-corasick算法,性能最优但实现最复杂;动态更新词库可通过ajax定时拉取或websocket实时推送,需注意数据一致性与错误处理;复杂策略包括模糊匹配、语义分析、拼写纠错和繁简转换,可提升精度但增加成本;前端过滤应结合延迟执行、分批处理、web worker、缓存和用户反馈,在保证性能的同时提升用户体验,避免过度过滤。

JS如何实现关键字过滤

JS实现关键字过滤,核心在于构建一个敏感词库,然后高效地检测并替换文本中的敏感词。方法有很多,效率和精度各有差异。

解决方案

简单粗暴的循环替换: 这是最直接的方法,但效率也最低。将敏感词库存储为一个数组,然后遍历数组,对文本进行逐个替换。

function filterKeywords(text, keywords) {  let filteredText = text;  for (const keyword of keywords) {    const regex = new RegExp(keyword, 'gi'); // 'gi' 标志表示全局匹配和忽略大小写    filteredText = filteredText.replace(regex, '***'); // 替换为星号  }  return filteredText;}const keywords = ['敏感词1', '敏感词2', '敏感词3'];const text = '这是一段包含敏感词1和敏感词2的文本。';const filteredText = filterKeywords(text, keywords);console.log(filteredText); // 输出: 这是一段包含***和***的文本。

这种方法简单易懂,但当敏感词库很大或者文本很长时,性能会急剧下降。

RegExp

对象的创建和

replace

操作都是比较耗时的。

使用正则表达式一次性替换: 将所有敏感词用

|

连接起来,构建一个大的正则表达式,然后一次性替换。

function filterKeywordsRegex(text, keywords) {  const regex = new RegExp(keywords.join('|'), 'gi');  return text.replace(regex, '***');}const keywords = ['敏感词1', '敏感词2', '敏感词3'];const text = '这是一段包含敏感词1和敏感词2的文本。';const filteredText = filterKeywordsRegex(text, keywords);console.log(filteredText); // 输出: 这是一段包含***和***的文本。

这种方法相比第一种,效率有所提升,因为减少了

RegExp

对象的创建次数。但是,如果敏感词库非常大,构建超长的正则表达式可能会导致性能问题,甚至超出正则表达式引擎的限制。

使用Trie树(前缀树): Trie树是一种专门用于处理字符串匹配的数据结构。它可以高效地查找文本中是否包含敏感词。

class TrieNode {  constructor() {    this.children = {};    this.isEndOfWord = false;  }}class Trie {  constructor() {    this.root = new TrieNode();  }  insert(word) {    let node = this.root;    for (const char of word) {      if (!node.children[char]) {        node.children[char] = new TrieNode();      }      node = node.children[char];    }    node.isEndOfWord = true;  }  search(text) {    let filteredText = '';    for (let i = 0; i < text.length; i++) {      let node = this.root;      let j = i;      let found = false;      while (j < text.length && node.children[text[j]]) {        node = node.children[text[j]];        if (node.isEndOfWord) {          found = true;          break;        }        j++;      }      if (found) {        filteredText += '***';        i = j - 1; // 跳过已匹配的敏感词      } else {        filteredText += text[i];      }    }    return filteredText;  }}const trie = new Trie();const keywords = ['敏感词1', '敏感词2', '敏感词3'];for (const keyword of keywords) {  trie.insert(keyword);}const text = '这是一段包含敏感词1和敏感词2的文本。';const filteredText = trie.search(text);console.log(filteredText); // 输出: 这是一段包含***和***的文本。

Trie树的优点是查找效率高,尤其是在敏感词库很大的情况下。它的缺点是实现起来相对复杂,并且需要额外的空间来存储树结构。

Aho-Corasick算法: Aho-Corasick算法是基于Trie树的多模式匹配算法。它在Trie树的基础上增加了失败指针,可以进一步提高匹配效率。 实现起来比较复杂,但性能优秀,适合对性能要求很高的场景。

如何选择合适的关键字过滤方法?

选择哪种方法取决于具体的应用场景。

如果敏感词库很小,文本也很短,那么简单粗暴的循环替换或者正则表达式一次性替换就足够了。如果敏感词库很大,或者文本很长,那么Trie树或者Aho-Corasick算法是更好的选择。如果对性能要求很高,那么Aho-Corasick算法是最佳选择。

副标题1

如何动态更新JS中的敏感词库,而无需重新加载页面?

动态更新敏感词库是一个常见的需求,尤其是在内容审核等场景下。 最简单的方法是使用 AJAX 定期从服务器拉取最新的敏感词列表。

function updateKeywords() {  fetch('/api/keywords') // 假设服务器提供一个API接口返回敏感词列表    .then(response => response.json())    .then(data => {      keywords = data; // 更新全局的敏感词库      console.log('敏感词库已更新:', keywords);    })    .catch(error => {      console.error('更新敏感词库失败:', error);    });}// 定期更新敏感词库,例如每隔10分钟setInterval(updateKeywords, 600000);// 初始加载时更新一次updateKeywords();

另一种方法是使用 WebSocket,服务器主动推送更新后的敏感词列表。 这种方法可以实现实时更新,但需要服务器端的支持。

无论使用哪种方法,都需要注意以下几点:

线程安全: 如果有多个线程同时访问敏感词库,需要采取线程安全措施,例如使用锁。 但JS是单线程的,所以通常不需要考虑线程安全问题。数据一致性: 确保在更新敏感词库时,不会出现数据不一致的情况。 例如,可以先创建一个新的敏感词库,然后将旧的敏感词库替换为新的敏感词库。错误处理: 处理更新敏感词库失败的情况,例如记录日志、重试等。

副标题2

除了简单的替换,如何实现更复杂的关键字过滤策略,例如模糊匹配或语义分析?

除了简单的替换,还可以使用一些更复杂的关键字过滤策略,例如:

模糊匹配: 使用正则表达式进行模糊匹配。 例如,可以使用

[sS]*

匹配任意字符,可以使用

?

匹配零个或一个字符。

const keywords = ['敏感词[sS]*1', '敏感词?2'];const text = '这是一段包含敏感词中间有很多字符1和敏感词2的文本。';const regex = new RegExp(keywords.join('|'), 'gi');const filteredText = text.replace(regex, '***');console.log(filteredText); // 输出: 这是一段包含***和***的文本。

语义分析: 使用自然语言处理(NLP)技术进行语义分析。 例如,可以使用词向量来计算文本与敏感词之间的相似度。 如果相似度超过某个阈值,则认为文本包含敏感词。 这需要引入额外的NLP库,例如

natural

或者使用在线的NLP API。

拼写纠错: 对文本进行拼写纠错,然后再进行关键字过滤。 这可以防止用户通过拼写错误来绕过关键字过滤。 可以使用现成的拼写纠错库,例如

spellchecker-js

。

繁简体转换: 将文本转换为简体或繁体,然后再进行关键字过滤。 这可以防止用户通过使用繁体字或简体字来绕过关键字过滤。 可以使用现成的繁简体转换库,例如

opencc

。

这些更复杂的策略可以提高关键字过滤的精度,但也会增加实现的复杂度和计算成本。

副标题3

如何在前端进行关键字过滤的同时,兼顾性能和用户体验?

在前端进行关键字过滤,需要特别注意性能和用户体验。 以下是一些建议:

延迟执行: 不要在用户每次输入时都进行关键字过滤。 可以设置一个延迟时间(例如 300 毫秒),在用户停止输入一段时间后才进行关键字过滤。 可以使用

setTimeout

函数来实现延迟执行。

分批处理: 如果文本很长,可以将其分成多个小块,然后分批进行关键字过滤。 可以使用

requestAnimationFrame

函数来避免阻塞UI线程。

Web Worker: 将关键字过滤放在 Web Worker 中执行,避免阻塞UI线程。 Web Worker 是一个独立的线程,可以执行 JavaScript 代码,而不会影响UI线程的响应。

缓存结果: 如果文本没有发生变化,可以直接使用缓存的结果,而无需重新进行关键字过滤。

优化算法: 选择合适的关键字过滤算法,例如 Trie树或Aho-Corasick算法。

用户反馈: 在进行关键字过滤时,给用户提供明确的反馈。 例如,可以高亮显示敏感词,或者提示用户修改文本。 避免直接阻止用户提交,应该引导用户修改内容。

避免过度过滤: 不要过度过滤,以免误伤正常内容。 可以设置一个阈值,只有当文本中包含的敏感词数量超过阈值时,才进行过滤。

总而言之,前端关键字过滤需要在性能、精度和用户体验之间进行权衡。 没有银弹,需要根据具体的应用场景选择合适的策略。 重要的是要进行充分的测试,并根据测试结果进行优化。

以上就是JS如何实现关键字过滤的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1516743.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JS如何实现代理模式
上一篇 2025年12月20日 10:16:45
Web Workers怎么使用
下一篇 2025年12月20日 10:17:03

相关推荐

  • 解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题

    解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题

    本文旨在解决JavaFX应用在Eclipse中正常运行,但导出为可运行JAR包后,因FXMLLoader无法找到FXML资源文件而抛出IllegalStateException: Location is not set异常的问题。核心解决方案是调整FXMLLoader.setLocation()方法…

    2026年9月25日 • 用户投稿
    100
  • 2025 上半年中国蓝牙耳机市场份额出炉:小米第一

    2025 上半年中国蓝牙耳机市场份额出炉:小米第一2025 上半年中国蓝牙耳机市场份额出炉:小米第一2025 上半年中国蓝牙耳机市场份额出炉:小米第一2025 上半年中国蓝牙耳机市场份额出炉:小米第一

    根据 idc 最新发布的数据,2025 年上半年中国蓝牙耳机市场出货量约为 5998 万台,同比增长 7.5%。其中,小米以 16.5% 的市场份额位居榜首。值得注意的是,耳夹式耳机在 2025 年上半年的市场规模与增速首次超越耳挂式产品,实现出货量 651 万台,同比增长高达 41.0%。 小米耳…

    2026年9月25日 • 用户投稿
    200
  • 7 月中国电视市场出货量为 186.0 万台 海信、TCL 居前二

    7 月中国电视市场出货量为 186.0 万台 海信、TCL 居前二7 月中国电视市场出货量为 186.0 万台 海信、TCL 居前二7 月中国电视市场出货量为 186.0 万台 海信、TCL 居前二7 月中国电视市场出货量为 186.0 万台 海信、TCL 居前二

    8 月 13 日,洛图科技(runto)发布《中国电视市场品牌出货月度快报》。2025 年 7 月,中国电视市场品牌整机出货量为 186.0 万台,较去年同期下降 14.3%,创下近 13 个月来最大的单月同比跌幅;同时,环比 6 月大幅下降 28.2%。 电视 CNMO 注意到,2025 年 7 …

    2026年9月25日 • 用户投稿
    000
  • Groovy编程:在HTTP请求头中传递授权令牌的实践指南

    Groovy编程:在HTTP请求头中传递授权令牌的实践指南Groovy编程:在HTTP请求头中传递授权令牌的实践指南Groovy编程:在HTTP请求头中传递授权令牌的实践指南Groovy编程:在HTTP请求头中传递授权令牌的实践指南

    本教程详细介绍了如何在Groovy中通过HTTP请求头发送授权令牌,以实现对RESTful API的安全访问。针对用户在Groovy中模拟curl -H ‘Authorization: token …’命令时遇到的常见问题,本文提供了基于java.net.URL和…

    2026年9月25日 • 用户投稿
    900
  • laravel怎么清除应用的所有缓存_laravel应用缓存清理方法

    Laravel应用响应异常或配置未生效时,需清除缓存。依次执行php artisan route:clear、config:clear、view:clear和cache:clear命令,可分别清除路由、配置、视图及应用缓存,确保修改生效。 如果您发现 Laravel 应用响应异常或配置更改未生效,可…

    2026年9月25日
    200
  • 动态缓存键配置:Spring Boot 缓存管理的灵活应用

    动态缓存键配置:Spring Boot 缓存管理的灵活应用动态缓存键配置:Spring Boot 缓存管理的灵活应用动态缓存键配置:Spring Boot 缓存管理的灵活应用动态缓存键配置:Spring Boot 缓存管理的灵活应用

    在 Spring Boot 应用中,使用 @Cacheable 注解可以方便地实现缓存功能。然而,在某些场景下,我们需要根据请求参数动态地生成缓存键,而不是简单地使用固定的键值。虽然 @Cacheable 注解允许通过 key 属性指定 SpEL 表达式来生成缓存键,但有时我们可能需要更灵活的控制,…

    2026年9月25日 • 用户投稿
    200
  • 动态缓存键在Spring Boot中的实现教程

    动态缓存键在Spring Boot中的实现教程动态缓存键在Spring Boot中的实现教程动态缓存键在Spring Boot中的实现教程动态缓存键在Spring Boot中的实现教程

    本文介绍了如何在Spring Boot应用中实现基于请求参数的动态缓存键。通过直接操作CacheManager获取缓存对象,并使用cache.get(key, () -> …)方法,可以灵活地根据请求参数生成缓存键,从而实现更精细化的缓存控制。这种方法避免了直接修改缓存名称,而是专…

    2026年9月25日 • 用户投稿
    700
  • 高效并发处理共享列表与结果收集的Java教程

    高效并发处理共享列表与结果收集的Java教程高效并发处理共享列表与结果收集的Java教程高效并发处理共享列表与结果收集的Java教程高效并发处理共享列表与结果收集的Java教程

    本文介绍了如何利用Java并发特性,特别是并行流(Parallel Streams),来高效处理共享列表,并将处理结果进行收集。针对耗时操作,通过将列表分割成子列表,并利用并行流并发执行,可以显著提高处理效率。同时,强调了在并发环境下对共享资源进行同步的重要性,并提供了收集处理结果的示例代码。 在处…

    2026年9月25日 • 用户投稿
    100
  • 如何在微服务之间共享静态数据

    如何在微服务之间共享静态数据如何在微服务之间共享静态数据如何在微服务之间共享静态数据如何在微服务之间共享静态数据

    微服务架构的本质决定了微服务之间无法直接共享静态变量。正如上面摘要所说,每个微服务都是一个独立的进程,拥有自己的内存空间,静态变量只在其所属的进程内有效。试图在一个微服务中访问另一个微服务的静态变量,就像试图在一个独立的Java程序中访问另一个程序的变量一样,是不可能的。 微服务架构的独立性 微服务…

    2026年9月25日 • 用户投稿
    100
  • 如何在微服务之间共享静态数据?

    如何在微服务之间共享静态数据?如何在微服务之间共享静态数据?如何在微服务之间共享静态数据?如何在微服务之间共享静态数据?

    在微服务架构中,各个服务都是独立的部署单元,拥有各自的内存空间。如同上述摘要所述,直接通过静态变量在不同的微服务之间共享数据是不可能的。 试图在一个微服务中设置静态变量的值,然后在另一个微服务中访问它,将会得到 null 或初始值,而不是之前设置的值。 这不是 Spring Boot 特有的问题,而…

    2026年9月25日 • 用户投稿
    100
  • 【新手入门】使用ERNIE-4.5-0.3B-Paddle从原始文本构建知识图谱

    1. 概述 本文将探讨如何使用ernie-4.5-0.3b-paddle模型从原始文本构建知识图谱。通过结合大语言模型(llm)和检索增强生成(rag)技术实现文本生成,帮助我们从非结构化数据中高效提取实体和关系信息。 2. 什么是知识图谱? 2.1 基本概念 知识图谱是一种语义网络,它表示和连接现…

    2026年9月25日
    100
  • 从文件解析游戏物品数据:Java实现教程

    从文件解析游戏物品数据:Java实现教程从文件解析游戏物品数据:Java实现教程从文件解析游戏物品数据:Java实现教程从文件解析游戏物品数据:Java实现教程

    本教程详细介绍了如何从文本文件中解析结构化的游戏物品数据,例如itemName:(“Steel Sword”),itemStats(2,0,0);。通过构建一个Item类来封装物品属性,并利用Java的文件I/O和字符串处理功能,实现数据的读取、解析和存储到对象列表中,从而为…

    2026年9月25日 • 用户投稿
    000
  • JBoss EAP 中 JMS MDB 消息丢失问题的诊断与解决

    JBoss EAP 中 JMS MDB 消息丢失问题的诊断与解决JBoss EAP 中 JMS MDB 消息丢失问题的诊断与解决JBoss EAP 中 JMS MDB 消息丢失问题的诊断与解决JBoss EAP 中 JMS MDB 消息丢失问题的诊断与解决

    在JBoss EAP环境中,当JMS消息驱动Bean(MDB)似乎间歇性丢失消息时,常见的原因并非消息真正丢失,而是被意外的消费者处理。通过分析JMS队列的运行时指标,特别是消费者数量与预期不符时,通常可以发现存在重复或多余的MDB部署。本教程将指导您如何诊断此类问题,利用JBoss CLI工具识别…

    2026年9月25日 • 用户投稿
    000
  • 显卡驱动优化对游戏性能的影响常被低估了吗?

    显卡驱动优化对游戏性能的影响常被低估了吗?显卡驱动优化对游戏性能的影响常被低估了吗?显卡驱动优化对游戏性能的影响常被低估了吗?显卡驱动优化对游戏性能的影响常被低估了吗?

    显卡驱动对游戏性能影响深远,不仅是帧数提升的关键,还关乎稳定性、画质、输入延迟和新功能支持。新驱动通过优化渲染指令、修复Bug、支持新技术(如DLSS、FSR)显著改善体验,尤其在新游戏发布时效果明显。建议在玩新游戏或遇问题时更新,优先选择“Game Ready”驱动,更新前阅读发布说明、做干净安装…

    2026年9月25日 • 用户投稿
    100
  • JBoss EAP 7.2:JMS MDB 消息丢失问题排查与解决

    JBoss EAP 7.2:JMS MDB 消息丢失问题排查与解决JBoss EAP 7.2:JMS MDB 消息丢失问题排查与解决JBoss EAP 7.2:JMS MDB 消息丢失问题排查与解决JBoss EAP 7.2:JMS MDB 消息丢失问题排查与解决

    本文旨在帮助开发者排查和解决 JBoss EAP 7.2 环境下 JMS MDB 消息丢失的问题。通过分析 JMS 队列的运行时状态,确定是否存在多个消费者,并提供相应的排查命令,最终解决消息无法被 MDB 消费的问题。 在 JBoss EAP 7.2 中,当使用 JMS 消息驱动 Bean (MD…

    2026年9月25日 • 用户投稿
    000
  • Java ParallelStream线程池管理:定制并发与I/O优化

    Java ParallelStream线程池管理:定制并发与I/O优化Java ParallelStream线程池管理:定制并发与I/O优化Java ParallelStream线程池管理:定制并发与I/O优化Java ParallelStream线程池管理:定制并发与I/O优化

    本文深入探讨了Java ParallelStream的线程池管理,特别是如何在I/O密集型任务(如数据库查询)中定制其并发行为。我们将介绍如何通过自定义ForkJoinPool来限制ParallelStream的线程数量,并强调在处理数据库操作时,除了线程池大小,还需关注数据库连接数等关键资源,并讨…

    2026年9月25日 • 用户投稿
    100
  • iPhone 17系列包揽第38周手机销量前三 荣耀X70第四

    iPhone 17系列包揽第38周手机销量前三 荣耀X70第四iPhone 17系列包揽第38周手机销量前三 荣耀X70第四iPhone 17系列包揽第38周手机销量前三 荣耀X70第四iPhone 17系列包揽第38周手机销量前三 荣耀X70第四

    近日,有数码博主公布了2025年第38周国内手机市场销量Top20榜单。数据显示,苹果成为当周最大赢家,共五款机型进入榜单,其中刚发布的新机iPhone 17系列三款产品更是强势包揽销量榜前三名。 iPhone 17 Pro系列 榜单具体排名如下: 豆包大模型 字节跳动自主研发的一系列大型语言模型 …

    2026年9月25日 • 用户投稿
    000
  • Java Stream API:高效处理列表数据,按组合键去重并选择最新记录

    Java Stream API:高效处理列表数据,按组合键去重并选择最新记录Java Stream API:高效处理列表数据,按组合键去重并选择最新记录Java Stream API:高效处理列表数据,按组合键去重并选择最新记录Java Stream API:高效处理列表数据,按组合键去重并选择最新记录

    本文详细介绍了如何利用Java Stream API,特别是Collectors.toMap,对包含重复条目的对象列表进行高级过滤。教程将演示如何根据对象的多个字段(如姓名组合)确定唯一性,并在出现重复时,根据特定字段(如日期)选择最新或最符合条件的记录,从而实现数据的高效聚合与筛选。 业务场景与问…

    2026年9月25日 • 用户投稿
    200
  • DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理

    DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理DeepSeek如何配置自动扩缩容 DeepSeek弹性计算资源管理

    要实现deepseek的自动扩缩容,核心在于根据负载动态调整资源。1. 首先确定监控指标,如gpu利用率、请求延迟、并发数等,优先关注服务压力关键指标;2. 设置扩缩策略,基于规则适用于周期性负载,基于预测适合波动无规律场景;3. 选择资源类型,spot实例适合容忍中断任务,按量付费适合高可用服务,…

    2026年9月25日 • 用户投稿
    000
  • Hadoop MapReduce实现累计电量数据的最大小时耗电量计算

    本文详细介绍了如何使用Hadoop MapReduce从累计电量读数中计算出所有住户和所有日期内的最大小时耗电量。教程将分析原始代码的问题,包括自定义Writable类的序列化错误和逻辑缺陷,并提供一个基于两阶段MapReduce任务的完整解决方案,涵盖自定义数据类型、Mapper、Reducer的…

    2026年9月25日
    000

发表回复

登录后才能评论
关注微信