html本地字符串处理工具|去重、分割、求交集、求并集

news2025/1/7 18:22:07

在这里插入图片描述

源代码(保存到本地文件命名为 xxx.html,用浏览器打开该文件即可使用)

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title>数据处理</title>
    <style>
        input,
        textarea {
            width: 100%;
            box-sizing: border-box;
        }

        button {
            margin: 5px;
        }

        .section {
            margin-bottom: 15px;
            border: 1px solid #ccc;
            padding: 10px;
        }

        .output {
            height: 100px;
            overflow-y: auto;
        }

        .hidden {
            display: none;
        }
    </style>
</head>

<body>
    <div class="sectionA">
        <h3>A 的输入界面</h3>
        <textarea id="inputA" rows="3" oninput="hideOutput('A')"></textarea>
        <span style="display: flex; align-items: center;">
            <p>分割符</p><input type="text" id="splitSymbolA" value="," placeholder="输入分割符,默认为英文逗号" style="width: 50px;">
            <button id="previewA" onclick="preview('A')">预览</button>
            <select id="formatSelectA" onchange="preview('A')">
                <option value="1">["a","b"]</option>
                <option value="2">[a,b]</option>
                <option value="3">[a b]</option>
                <option value="4">a\nb</option>
            </select>
            <input type="checkbox" id="removeDuplicatesA" style="margin-left: 10px; width: 30px;" onclick="preview('A')">
            <label for="removeDuplicates">去重</label>
            <input type="checkbox" id="filterEmptyA" style="margin-left: 10px; width: 30px;" onclick="preview('A')">
            <label for="filterEmpty">过滤空值</label>
            <input type="checkbox" id="useSplitSymbolA" style="margin-left: 10px; width: 30px;" onclick="preview('A')" checked="true">
            <label for="useSplitSymbol">使用分隔符</label>
            <input type="checkbox" id="splitByEnterA" style="margin-left: 10px; width: 30px;" onclick="preview('A')">
            <label for="splitByEnter">回车分割</label>
            <!-- 更多分割符list -->
            <input type="checkbox" id="showSplitByMoreSymbolA" style="margin-left: 10px; width: 30px;" onclick="showSplitByMoreSymbol('A')">
            <label for="showSplitByMoreSymbol">更多分割符(使用|分隔)</label>
        </span>
        <input type="text" id="splitByMoreSymbolA" value="" style="display:none;" placeholder="输入分割符,默认为|" style="width: 50px;" onchange="preview('A')">
        
        <div class="section outputA" style="display: none;">
            <span style="display: flex; align-items: center;">
                <h4>A 输出框</h4> <p id="outputACount"></p>
            </span>
            <textarea id="outputA" readonly style="border: none; background-color: #FFFFCC;"></textarea>
        </div>
    </div>
    <div class="sectionB">
        <h3>B 的输入界面</h3>
        <textarea id="inputB" rows="3" oninput="hideOutput('B')"></textarea>
        <span style="display: flex; align-items: center;">
            <p>分割符</p><input type="text" id="splitSymbolB" value="," placeholder="输入分割符,默认为英文逗号" style="width: 50px;">
            <button id="previewB" onclick="preview('B')">预览</button>

            <select id="formatSelectB" onchange="preview('B')">
                <option value="1">["a","b"]</option>
                <option value="2">[a,b]</option>
                <option value="3">[a b]</option>
                <option value="4">a\nb</option>
            </select>
            <input type="checkbox" id="removeDuplicatesB" style="margin-left: 10px; width: 30px;" onclick="preview('B')">
            <label for="removeDuplicates">去重</label>
            <input type="checkbox" id="filterEmptyB" style="margin-left: 10px; width: 30px;" onclick="preview('B')">
            <label for="filterEmpty">过滤空值</label>
            <input type="checkbox" id="useSplitSymbolB" style="margin-left: 10px; width: 30px;" onclick="preview('B')" checked="true">
            <label for="useSplitSymbol">使用分隔符</label>
            <input type="checkbox" id="splitByEnterB" style="margin-left: 10px; width: 30px;" onclick="preview('B')">
            <label for="splitByEnter">回车分割</label>
            <!-- 更多分割符list -->
            <input type="checkbox" id="showSplitByMoreSymbolB" style="margin-left: 10px; width: 30px;" onclick="showSplitByMoreSymbol('B')">
            <label for="showSplitByMoreSymbol">更多分割符(使用|分隔)</label>
        </span>
        <input type="text" id="splitByMoreSymbolB" value="" style="display:none;" placeholder="输入分割符,默认为|" style="width: 50px;" onchange="preview('B')">
        
        <div class="section outputB" style="display: none;">
            <span style="display: flex; align-items: center;">
                <h4>A 输出框</h4> <p id="outputBCount"></p>
            </span>
            <textarea id="outputB" readonly style="border: none; background-color: #FFFFCC;"></textarea>
        </div>
    </div>
    <hr>
    <div class="sectionOut">
        <h3>AB 之间的数据处理</h3>
        <button id="intersection">求交集(去重)</button>
        <button id="union">求并集(去重)</button>
        <button id="aNotB">求 A 中有 B 中没有(去重)</button>
        <button id="bNotA">求 B 中有 A 中没有(去重)</button>
    </div>
    <div class="sectionResult">
        <h4>结果</h4>
        <textarea id="inputC" rows="3" placeholder="暂无匹配结果" readonly></textarea>
    </div>
    <span style="display: flex; align-items: center;">
        <p>分割符</p><input type="text" id="splitSymbolC" value="|" placeholder="输入分割符,默认为|" style="width: 50px;">
        <button id="previewC" onclick="preview('C')">预览</button>

        <select id="formatSelectC" onchange="preview('C')">
            <option value="1">["a","b"]</option>
            <option value="2">[a,b]</option>
            <option value="3">[a b]</option>
            <option value="4">a\nb</option>
        </select>
        <input type="checkbox" id="removeDuplicatesC" style="margin-left: 10px; width: 30px;" onclick="preview('C')">
        <label for="removeDuplicates">去重</label>
        <input type="checkbox" id="filterEmptyC" style="margin-left: 10px; width: 30px;" onclick="preview('C')">
        <label for="filterEmpty">过滤空值</label>
        <input type="checkbox" id="useSplitSymbolC" style="margin-left: 10px; width: 30px;" onclick="preview('C')" checked="true">
        <label for="useSplitSymbol">使用分隔符</label>
        <input type="checkbox" id="splitByEnterC" style="margin-left: 10px; width: 30px;" onclick="preview('C')">
        <label for="splitByEnter">回车分割</label>
        <!-- 更多分割符list -->
        <input type="checkbox" id="showSplitByMoreSymbolC" style="margin-left: 10px; width: 30px;" onclick="showSplitByMoreSymbol('C')">
        <label for="showSplitByMoreSymbol">更多分割符(使用|分隔)</label>
    </span>
    <input type="text" id="splitByMoreSymbolC" value="" style="display:none;" placeholder="输入分割符,默认为|" style="width: 50px;" onchange="preview('C')">
        
    <div class="section outputC" style="display: none;">
        <span style="display: flex; align-items: center;">
            <h4>结果 格式化 输出框</h4> <p id="outputCCount"></p>
        </span>
        <textarea id="outputC" readonly style="border: none; background-color: #FFFFCC;"></textarea>
    </div>
    <script>

        // 隐藏输出框
        function hideOutput(opt) {
            document.getElementById(`output${opt}`).value = "";
            document.querySelector(`.section.output${opt}`).style.display = 'none';
        }

        // 展示showSplitByMoreSymbol
        function showSplitByMoreSymbol(opt) {
            let showSplitByMoreSymbol = document.getElementById(`showSplitByMoreSymbol${opt}`).checked;
            if(showSplitByMoreSymbol){
                document.getElementById(`splitByMoreSymbol${opt}`).style.display = 'block';
            }else{
                document.getElementById(`splitByMoreSymbol${opt}`).style.display = 'none';
            }
            preview(opt);
        }

        // 预览按钮
        function preview(opt) {
            let input = document.getElementById(`input${opt}`).value;
            let format = document.getElementById(`formatSelect${opt}`).value;
            let splitSymbol = document.getElementById(`splitSymbol${opt}`).value;
            let removeDuplicates = document.getElementById(`removeDuplicates${opt}`).checked;
            let filterEmpty = document.getElementById(`filterEmpty${opt}`).checked;
            let splitByEnter = document.getElementById(`splitByEnter${opt}`).checked;
            let useSplitSymbol = document.getElementById(`useSplitSymbol${opt}`).checked;
            let showSplitByMoreSymbol = document.getElementById(`showSplitByMoreSymbol${opt}`).checked;
            let splitByMoreSymbol = document.getElementById(`splitByMoreSymbol${opt}`).value;
            console.log('input', input,'format', format,'splitSymbol', splitSymbol,'removeDuplicates', removeDuplicates,'filterEmpty', filterEmpty,'splitByEnter', splitByEnter,'useSplitSymbol', useSplitSymbol);

            const separators = []; // 存储所有可能的分隔符

            // 使用回车分割
            if(splitByEnter){
                separators.push(/\n/g);
            }

            // 使用分隔符分割
            if(useSplitSymbol){
                separators.push(splitSymbol);
            }

            // 使用跟多分割符
            if(showSplitByMoreSymbol){
                splitByMoreSymbol.split('|').forEach(symbol => {
                    if(symbol){
                        separators.push(symbol);
                    }
                })
            }

            // 开始分割
            let parts;
            if (separators.length > 0) {
                parts = separators.reduce((acc, separator) => {
                    return acc.reduce((subAcc, subStr) => {
                        return subAcc.concat(subStr.split(separator));
                    }, []);
                }, [input]);
            } else {
                parts = separators.length > 0 ? input.split(separators.join('|')) : [input];
            }

            // console.log('parts', parts);
            if (removeDuplicates) {
                parts = Array.from(new Set(parts));
            }
            // console.log('parts', parts);
            if (filterEmpty) {
                parts = parts.filter(p => p.trim() !== '');
            }

            console.log(`parts${opt}`, parts);
            document.getElementById(`output${opt}Count`).innerText = `  (${parts.length}个)`;

            let result = '';
            if (format === '1') {
                result = JSON.stringify(parts.map(p => p.trim()));
            } else if (format === '2') {
                result = '[' + parts.map(p => p.trim()).join(',') + ']';
            } else if (format === '3') {
                result = '[' + parts.join(' ') + ']';
            } else if (format === '4') {
                result = parts.join('\n');
            }
            document.getElementById(`output${opt}`).value = result;
            document.querySelector(`.section.output${opt}`).style.display = 'block';

            return parts;
        }

        function getParts(opt) {
            if(opt==='A'){
                return preview('A');
            }
            if(opt==='B'){
                return preview('B');
            }
            return [];
        }

        document.getElementById('intersection').addEventListener('click', function () {
            let partsA = getParts('A');
            let partsB = getParts('B');
            let intersection = Array.from(partsA).filter(x => partsB.includes(x));
            document.getElementById('inputC').value = intersection.join('|'); 
            console.log('intersection', intersection);
        });
        document.getElementById('union').addEventListener('click', function () {
            let partsA = getParts('A');
            let partsB = getParts('B');
            let union = Array.from(new Set([...partsA, ...partsB]));
            document.getElementById('inputC').value = union.join('|');
            console.log('union', union);
        });
        document.getElementById('aNotB').addEventListener('click', function () {
            let partsA = getParts('A');
            let partsB = getParts('B');
            let aNotB = Array.from(partsA).filter(x => !partsB.includes(x));
            document.getElementById('inputC').value = aNotB.join('|');
            console.log('aNotB', aNotB);
        });
        document.getElementById('bNotA').addEventListener('click', function () {
            let partsA = getParts('A');
            let partsB = getParts('B');
            let bNotA = Array.from(partsB).filter(x => !partsA.includes(x));
            document.getElementById('inputC').value = bNotA.join('|');
            console.log('bNotA', bNotA);
        });
    </script>
</body>

</html>

配置到油猴脚本

将上述html代码放到 newWindow.document.write 中即可。

// ==UserScript==
// @name         Open Webpage from Menu
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Open a new webpage from a menu command
// @author       You
// @match        *://*/*
// @grant        GM_registerMenuCommand
// ==/UserScript==

(function() {
    'use strict';
    // 使用 GM_registerMenuCommand 注册一个菜单命令
    GM_registerMenuCommand("Open My Webpage", function() {
        // 当用户点击菜单命令时,使用 window.open 打开一个新的网页
        // 这里将 'https://example.com' 替换为你想要打开的网页的 URL
        window.open('https://example.com', '_blank');
    });
})();

或者

// ==UserScript==
// @name         Open HTML in Window
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Open a window with custom HTML
// @author       You
// @match        *://*/*
// @grant        GM_registerMenuCommand
// ==/UserScript==

(function() {
    'use strict';
    GM_registerMenuCommand("Open My HTML", function() {
        let htmlCode = `
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>My Custom Page</title>
            </head>
            <body>
                <h1>Hello, World!</h1>
                <p>This is a custom HTML page opened via Tampermonkey script.</p>
            </body>
            </html>
        `;
        let newWindow = window.open('', '_blank');
        newWindow.document.write(htmlCode);
    });
})();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Python的考研学习系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

计算机网络 —— 网络编程(TCP)

计算机网络 —— 网络编程&#xff08;TCP&#xff09; TCP和UDP的区别TCP (Transmission Control Protocol)UDP (User Datagram Protocol) 前期准备listen &#xff08;服务端&#xff09;函数原型返回值使用示例注意事项 accpect &#xff08;服务端&#xff09;函数原型返回…

Vue 项目自动化部署:Coding + Jenkins + Nginx 实践分享

前言 本文详细记录如何使用 Coding (以 Jenkinsfile 为核心) 和 Nginx 部署 Vue 项目&#xff0c;包含完整流程、配置细节及注意事项&#xff0c;为开发者提供一个高效的实践参考。 准备工作 这里借用一个优秀的开源项目做演示&#xff1a;芋道源码/yudao-ui-admin-vue2。 以…

Mysql运维利器之备份恢复-xtrabackup 安装

1、插件下载 xtrabackup 下载地址 找到自己mysql版本对应得 插件版本下载 2、执行安装命令 yum localinstall percona-xtrabackup-80-8.0.26-18.1.el7.x86_64.rpm 安装完毕&#xff01;查看版本信息 xtrabackup --version 安装完毕&#xff01;&#xff01;&#xff01;

【JAVA】神经网络的基本结构和前向传播算法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

ip属地的信息准确吗?ip归属地不准确怎么办

在数字化时代&#xff0c;IP属地信息成为了我们日常生活中不可或缺的一部分。在各大社交媒体平台上&#xff0c;IP属地信息都扮演着重要的角色。然而&#xff0c;随着技术的不断进步和网络的复杂性增加&#xff0c;IP属地信息的准确性问题也日益凸显。那么&#xff0c;IP属地信…

Flask----前后端不分离-登录

文章目录 扩展模块flask-wtf 的简单使用定义用户数据模型flask-login完成用户登录 扩展模块 flask-sqlalchmy&#xff0c;连接数据库flask-login&#xff0c;处理用户的登录&#xff0c;认证flask-session&#xff0c;会话保持&#xff0c;默认对用户数据加密&#xff0c;存储…

[读书日志]从零开始学习Chisel 第一篇:书籍介绍,Scala与Chisel概述,Scala安装运行(敏捷硬件开发语言Chisel与数字系统设计)

简介&#xff1a;从20世纪90年代开始&#xff0c;利用硬件描述语言和综合技术设计实现复杂数字系统的方法已经在集成电路设计领域得到普及。随着集成电路集成度的不断提高&#xff0c;传统硬件描述语言和设计方法的开发效率低下的问题越来越明显。近年来逐渐崭露头角的敏捷化设…

计算机网络掩码、最小地址、最大地址计算、IP地址个数

一、必备知识 1.无分类地址IPV4地址网络前缀主机号 2.每个IPV4地址由32位二进制数组成 3. /15这个地址表示网络前缀有15位&#xff0c;那么主机号32-1517位。 4.IP地址的个数&#xff1a;2**n (n表示主机号的位数) 5.可用&#xff08;可分配&#xff09;IP地址个数&#x…

【阅读笔记】基于FPGA的红外图像二阶牛顿插值算法的实现

图像缩放技术在图像显示、传输、分析等多个领域中扮演着重要角色。随着数字图像处理技术的发展&#xff0c;对图像缩放质量的要求也越来越高。二阶牛顿插值因其在处理图像时能够较好地保持边缘特征和减少细节模糊&#xff0c;成为了图像缩放中的一个研究热点。 一、 二阶牛顿插…

计算机毕业设计Python电商品推荐系统 商品比价系统 电商比价系统 商品可视化 商品爬虫 机器学习 深度学习 京东爬虫 国美爬虫 淘宝爬虫 大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

BBP飞控板中的坐标系变换

一般飞控板中至少存在以下坐标系&#xff1a; 陀螺Gyro坐标系加速度计Acc坐标系磁强计Mag坐标系飞控板坐标系 在BBP飞控板采用的IMU为同时包含了陀螺&#xff08;Gyro&#xff09;及加速度计&#xff08;Acc&#xff09;的6轴传感器&#xff0c;故Gyro及Acc为同一坐标系。同时…

企业网络综合组网

1 概述 2 网络需求分析 2.1企业需求分析 公司规模 员工规模&#xff1a;200人&#xff0c;其中包括技术研发人员&#xff0c;市场营销人员&#xff0c;运营管理人员&#xff0c;客户服务人员等。部门数量&#xff1a;19个部门&#xff0c;包括财务部&#xff0c;人力资源部…

【沉默的羔羊心理学】汉尼拔的“移情”游戏:操纵与理解的艺术,精神分析学视角下的角色互动

终极解读《沉默的羔羊》&#xff1a;弗洛伊德精神分析学视角下的深层剖析 关键词 沉默的羔羊弗洛伊德精神分析学角色心理意识与潜意识性别与身份 弗洛伊德精神分析学简介 弗洛伊德的精神分析学是心理学的一个重要分支&#xff0c;主要关注人类行为背后的无意识动机和冲突。…

Qt窗口获取Tftpd32_svc服务下载信息

前言 一个由Qt开发的Windows小工具需要布置Tftp协议服务端来支持设备下载数据&#xff0c;并显示下载列表&#xff08;进度、下载源等&#xff09;。 考虑开发方便&#xff0c;优先使用了Qtftp方案&#xff0c;经测试发现&#xff0c;不够稳定&#xff0c;会有下载超时的情况&a…

合合信息亮相CSIG AI可信论坛,全面拆解AI视觉内容安全的“终极防线”

合合信息亮相CSIG AI可信论坛&#xff0c;全面拆解视觉内容安全的“终极防线”&#xff01; &#x1f42f; AI伪造泛滥&#xff0c;我们还能相信“眼见为实”吗&#xff1f; 近期&#xff0c;由中国图象图形学学会主办的CSIG青年科学家会议 AI可信论坛在杭州成功举办。本次论…

Bash Shell的操作环境

目录 1、路径与指令搜寻顺序 2、bash的进站&#xff08;开机&#xff09;与欢迎信息&#xff1a;/etc/issue&#xff0c;/etc/motd &#xff08;1&#xff09;/etc/issue &#xff08;2&#xff09;/etc/motd 3、bash的环境配置文件 &#xff08;1&#xff09;login与non-…

如何在没有 iCloud 的情况下将联系人从 iPhone 传输到 iPhone

概括 近期iOS 13.5的更新以及苹果公司发布的iPhone SE在众多iOS用户中引起了不小的轰动。此外&#xff0c;不少变化&#xff0c;如暴露通知 API、Face ID 增强功能以​​及其他在 COVID-19 期间与公共卫生相关的新功能&#xff0c;吸引了 iPhone 用户尝试新 iPhone 并更新到最…

网站设计总结后期维护与更新的重要性

当我们谈论网站设计时&#xff0c;往往会聚焦在初始阶段的创意和实现上。然而&#xff0c;一旦网站建成并上线&#xff0c;后期维护与更新的重要性就显得尤为突出。一个网站的成功不仅取决于其初始设计&#xff0c;更在于持续的维护与更新。 首先&#xff0c;后期维护能够确保网…

Android NDK开发实战之环境搭建篇(so库,Gemini ai)

文章流程 音视频安卓开发首先涉及到ffmpeg编译打包动态库&#xff0c;先了解动态库之间的cpu架构差异性。然后再搭建可运行的Android 环境。 So库适配 ⽇常开发我们经常会使⽤到第三库&#xff0c;涉及到底层的语⾳&#xff0c;视频等都需要添加so库。⽽so库的体积⼀般来说 ⾮…