文字和谐处理脚本

替换网页中的敏感词汇为和谐内容

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         文字和谐处理脚本
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  替换网页中的敏感词汇为和谐内容
// @author       401
// @match        *://*/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 敏感词列表(键:需要替换的词,值:替换后的内容)
    const sensitiveWords = {
        '满足': '***',
        'b': '###',
        '测试词': '[已和谐]', // 用于测试的词汇
        // 可添加更多词汇
    };

    // 构建替换正则(取消单词边界\b,避免因特殊字符导致漏匹配;保留i忽略大小写)
    const sensitiveKeys = Object.keys(sensitiveWords).map(word =>
        // 转义特殊字符(如.、*、+等),避免正则语法错误
        word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
    );
    const regexPattern = new RegExp(`(${sensitiveKeys.join('|')})`, 'gi');

    // 替换文本节点函数
    function replaceText(node) {
        if (node.nodeType === Node.TEXT_NODE) {
            let originalText = node.textContent;
            if (!originalText) return; // 空文本直接跳过

            // 执行替换
            const replacedText = originalText.replace(regexPattern, match => {
                // 忽略大小写查找对应替换值
                const lowerMatch = match.toLowerCase();
                for (const [word, replacement] of Object.entries(sensitiveWords)) {
                    if (word.toLowerCase() === lowerMatch) {
                        console.log(`替换成功:"${match}" → "${replacement}"`); // 调试日志
                        return replacement;
                    }
                }
                return match; // 未匹配到则保持原样
            });

            // 只有内容变化时才更新,避免不必要的DOM操作
            if (replacedText !== originalText) {
                node.textContent = replacedText;
            }
        } else if (node.nodeType === Node.ELEMENT_NODE) {
            // 跳过脚本、样式、输入框等特殊标签
            const tagName = node.tagName.toUpperCase();
            if (['SCRIPT', 'STYLE', 'TEXTAREA', 'INPUT'].includes(tagName)) {
                return;
            }
            // 递归处理子节点
            Array.from(node.childNodes).forEach(child => replaceText(child));
        }
    }

    // 初始加载时处理页面
    replaceText(document.body);
    console.log('初始内容处理完成');

    // 监听动态内容变化(如AJAX加载、动态生成的内容)
    const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            mutation.addedNodes.forEach(node => {
                if (node.nodeType === Node.ELEMENT_NODE || node.nodeType === Node.TEXT_NODE) {
                    replaceText(node);
                }
            });
        });
    });

    // 启动观察者,监控整个页面的DOM变化
    observer.observe(document.body, {
        childList: true,   // 监控子节点增减
        subtree: true,    // 深入监控所有子树
        characterData: true // 监控文本内容变化
    });

})();