基于原版的基础上新增了一个功能点:IP-A段过滤,可以快速把内网192、170、10或者其它你想要过滤掉的IP-A段轻松去掉,提高你的干活效率!!!
界面样式预览:
在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>IP与域名提取工具 - 极速版</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"><style>* {margin: 0;padding: 0;box-sizing: border-box;font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;}body {background: linear-gradient(135deg, #1a2a6c, #b21f1f, #1a2a6c);min-height: 100vh;display: flex;justify-content: center;align-items: center;padding: 20px;color: #fff;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;}.container {width: 100%;max-width: 1200px;background: rgba(0, 0, 20, 0.8);border-radius: 20px;box-shadow: 0 15px 35px rgba(0, 0, 0, 0.5);overflow: hidden;backdrop-filter: blur(10px);border: 1px solid rgba(255, 255, 255, 0.1);}header {background: rgba(0, 10, 30, 0.9);padding: 25px 40px;text-align: center;border-bottom: 2px solid #00ccff;position: relative;}h1 {font-size: 2.5rem;margin-bottom: 10px;background: linear-gradient(90deg, #00ccff, #00ffcc);-webkit-background-clip: text;background-clip: text;color: transparent;text-shadow: 0 0 15px rgba(0, 204, 255, 0.5);}.subtitle {color: #a0d2ff;font-size: 1.1rem;opacity: 0.9;max-width: 800px;margin: 0 auto;line-height: 1.6;}.features {display: flex;justify-content: center;flex-wrap: wrap;gap: 15px;margin-top: 20px;}.feature {background: rgba(0, 204, 255, 0.15);border-radius: 8px;padding: 8px 15px;font-size: 0.9rem;display: flex;align-items: center;gap: 8px;color: #fff;}.mode-toggle {position: absolute;top: 20px;right: 20px;background: rgba(0, 204, 255, 0.2);border-radius: 20px;padding: 8px 16px;display: flex;align-items: center;gap: 8px;cursor: pointer;transition: all 0.3s ease;}.mode-toggle:hover {background: rgba(0, 204, 255, 0.3);}.mode-indicator {width: 12px;height: 12px;border-radius: 50%;background: #00ff00;box-shadow: 0 0 8px #00ff00;}.mode-indicator.off {background: #ff5555;box-shadow: 0 0 8px #ff5555;}.tooltip {position: absolute;top: -40px;right: 0;background: rgba(0, 40, 80, 0.9);color: #00ffcc;padding: 8px 12px;border-radius: 8px;font-size: 0.8rem;white-space: nowrap;opacity: 0;transition: opacity 0.3s ease;pointer-events: none;}.mode-toggle:hover .tooltip {opacity: 1;}.main-content {display: flex;flex-wrap: wrap;padding: 30px;gap: 30px;}.input-section {flex: 1;min-width: 300px;}.output-section {flex: 1;min-width: 300px;display: flex;flex-direction: column;gap: 30px;}.section-title {font-size: 1.4rem;margin-bottom: 15px;color: #00ccff;display: flex;align-items: center;gap: 10px;}.section-title i {font-size: 1.2rem;}textarea {width: 100%;height: 250px;background: rgba(0, 20, 40, 0.7);border: 1px solid rgba(0, 204, 255, 0.4);border-radius: 12px;padding: 20px;color: #fff;font-size: 1rem;resize: vertical;transition: all 0.3s ease;}textarea:focus {outline: none;border-color: #00ccff;box-shadow: 0 0 15px rgba(0, 204, 255, 0.4);}textarea::placeholder {color: rgba(160, 210, 255, 0.7);}.button-group {display: flex;gap: 15px;margin-top: 20px;flex-wrap: wrap;}.btn {flex: 1;min-width: 140px;padding: 15px 20px;border: none;border-radius: 10px;font-size: 1.1rem;font-weight: 600;cursor: pointer;transition: all 0.3s ease;display: flex;align-items: center;justify-content: center;gap: 10px;}.btn-primary {background: linear-gradient(90deg, #00a6ff, #00ffc3);color: #00203d;}.btn-secondary {background: rgba(255, 255, 255, 0.1);color: #00ccff;border: 1px solid rgba(0, 204, 255, 0.4);}.btn-orange {background: rgba(255, 165, 0, 0.2);color: #ffaa33;border: 1px solid rgba(255, 165, 0, 0.4);}.btn-purple {background: rgba(128, 0, 128, 0.2);color: #d8bfd8;border: 1px solid rgba(128, 0, 128, 0.4);}.btn:hover {transform: translateY(-3px);box-shadow: 0 7px 15px rgba(0, 0, 0, 0.3);}.btn:active {transform: translateY(1px);}.btn-primary:hover {background: linear-gradient(90deg, #0095e6, #00e6b8);}.btn-secondary:hover {background: rgba(255, 255, 255, 0.15);border-color: #00ccff;}.btn-orange:hover {background: rgba(255, 165, 0, 0.3);}.btn-purple:hover {background: rgba(128, 0, 128, 0.3);}.results-box {background: rgba(0, 20, 40, 0.7);border: 1px solid rgba(0, 204, 255, 0.4);border-radius: 12px;padding: 20px;min-height: 250px;position: relative;}.box-header {display: flex;justify-content: space-between;align-items: center;margin-bottom: 15px;gap: 15px;flex-wrap: wrap;}.copy-btn {background: rgba(0, 204, 255, 0.2);color: #00ccff;border: none;padding: 8px 15px;border-radius: 8px;cursor: pointer;transition: all 0.3s ease;display: flex;align-items: center;gap: 8px;flex-shrink: 0;}.copy-btn:hover {background: rgba(0, 204, 255, 0.3);}.results-content {max-height: 200px;overflow-y: auto;padding-right: 10px;}.results-content::-webkit-scrollbar {width: 8px;}.results-content::-webkit-scrollbar-track {background: rgba(0, 0, 0, 0.2);border-radius: 4px;}.results-content::-webkit-scrollbar-thumb {background: rgba(0, 204, 255, 0.5);border-radius: 4px;}.result-item {padding: 10px 15px;background: rgba(0, 40, 80, 0.4);border-radius: 8px;margin-bottom: 10px;display: flex;justify-content: space-between;align-items: center;animation: fadeIn 0.5s ease;color: #fff;font-weight: 500;letter-spacing: 0.03em;}.result-item.duplicate {background: rgba(180, 60, 60, 0.4);color: #ffaaaa;text-decoration: line-through;}.result-item.filtered {background: rgba(128, 0, 128, 0.3);color: #d8bfd8;text-decoration: line-through;}@keyframes fadeIn {from { opacity: 0; transform: translateY(10px); }to { opacity: 1; transform: translateY(0); }}.result-item .copy-icon {color: #00ccff;cursor: pointer;font-size: 1.1rem;transition: all 0.2s ease;}.result-item .copy-icon:hover {color: #00ffcc;transform: scale(1.1);}.empty-message {color: #a0d2ff;text-align: center;padding: 20px;font-style: italic;text-shadow: 0 1px 2px rgba(0,0,0,0.5);}.counter {background: rgba(0, 204, 255, 0.2);border-radius: 20px;padding: 3px 10px;font-size: 0.9rem;}.counter.warning {background: rgba(255, 204, 0, 0.2);}.counter.filtered {background: rgba(128, 0, 128, 0.3);}.notification {position: fixed;top: 20px;right: 20px;background: rgba(0, 40, 80, 0.9);color: #00ffcc;padding: 15px 25px;border-radius: 10px;box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);display: flex;align-items: center;gap: 10px;transform: translateX(120%);transition: transform 0.4s ease;z-index: 1000;border: 1px solid rgba(0, 204, 255, 0.4);}.notification.warning {background: rgba(100, 60, 0, 0.9);color: #ffcc00;border-color: rgba(255, 204, 0, 0.4);}.notification.filtered {background: rgba(128, 0, 128, 0.8);color: #d8bfd8;border-color: rgba(128, 0, 128, 0.6);}.notification.show {transform: translateX(0);}.filter-info {background: rgba(0, 40, 80, 0.5);border-radius: 8px;padding: 12px;margin-top: 15px;font-size: 0.9rem;border-left: 3px solid #00ccff;display: flex;align-items: center;gap: 10px;color: #fff;}.segment-info {background: rgba(128, 0, 128, 0.2);border-left-color: #9370db;}/* 重复IP列表样式 */.duplicate-ips-container {background: rgba(150, 50, 50, 0.3);border: 1px solid rgba(255, 100, 100, 0.4);border-radius: 12px;margin-top: 20px;overflow: hidden;max-height: 0;transition: max-height 0.4s ease;}.duplicate-ips-container.show {max-height: 500px;}.duplicate-ips-header {padding: 10px 15px;display: flex;justify-content: space-between;align-items: center;cursor: pointer;background: rgba(180, 60, 60, 0.4);color: #fff;}.duplicate-ips-content {max-height: 200px;overflow-y: auto;padding: 10px;}.duplicate-ip-item {padding: 8px 15px;background: rgba(180, 60, 60, 0.3);border-radius: 8px;margin-bottom: 8px;display: flex;justify-content: space-between;align-items: center;color: #fff;}.duplicate-count {background: rgba(255, 100, 100, 0.5);border-radius: 12px;padding: 2px 8px;font-size: 0.8rem;}/* 过滤IP段样式 */.segment-filter-container {display: flex;gap: 10px;margin-top: 15px;align-items: center;}.segment-input {flex: 1;padding: 12px 15px;background: rgba(0, 20, 40, 0.7);border: 1px solid rgba(128, 0, 128, 0.4);border-radius: 8px;color: #fff;font-size: 1rem;}.segment-input:focus {outline: none;border-color: #9370db;box-shadow: 0 0 10px rgba(147, 112, 219, 0.5);}.segment-input::placeholder {color: rgba(160, 120, 220, 0.7);}.filtered-ips-container {background: rgba(128, 0, 128, 0.2);border: 1px solid rgba(147, 112, 219, 0.4);border-radius: 12px;margin-top: 20px;overflow: hidden;max-height: 0;transition: max-height 0.4s ease;}.filtered-ips-container.show {max-height: 500px;}.filtered-ips-header {padding: 10px 15px;display: flex;justify-content: space-between;align-items: center;cursor: pointer;background: rgba(128, 0, 128, 0.3);color: #d8bfd8;}.filtered-ips-content {max-height: 200px;overflow-y: auto;padding: 10px;}.filtered-ip-item {padding: 8px 15px;background: rgba(128, 0, 128, 0.2);border-radius: 8px;margin-bottom: 8px;display: flex;justify-content: space-between;align-items: center;color: #d8bfd8;}.filtered-count {background: rgba(147, 112, 219, 0.5);border-radius: 12px;padding: 2px 8px;font-size: 0.8rem;}/* 按钮分组间距 */.action-buttons {display: flex;gap: 15px;flex-wrap: wrap;}/* 结果框标题区 */.results-header-container {display: flex;justify-content: space-between;align-items: center;width: 100%;flex-wrap: wrap;gap: 15px;}/* 顶部控制区间距 */.top-controls {display: flex;flex-wrap: wrap;justify-content: space-between;align-items: center;gap: 15px;width: 100%;}@media (max-width: 768px) {.main-content {flex-direction: column;}h1 {font-size: 2rem;}.features {flex-direction: column;align-items: center;}.mode-toggle {position: static;margin-top: 15px;align-self: center;}.box-header {flex-direction: column;align-items: flex-start;}.action-buttons {width: 100%;justify-content: space-between;margin-top: 10px;}.copy-btn {width: 100%;margin-top: 10px;}.segment-filter-container {flex-direction: column;align-items: stretch;}}</style>
</head>
<body><div class="container"><header><h1><i class="fas fa-network-wired"></i> IP与域名提取工具</h1><p class="subtitle">从文本中智能提取IP地址和域名,提供多种过滤模式与重复IP查看功能</p><div class="mode-toggle" id="modeToggle"><div class="tooltip">切换IP去重模式(唯一IP/传统去重)</div><div class="mode-indicator" id="modeIndicator"></div><span>唯一IP模式</span></div><div class="features"><div class="feature"><i class="fas fa-check-circle"></i> 智能域名识别</div><div class="feature"><i class="fas fa-filter"></i> IP过滤选项</div><div class="feature"><i class="fas fa-eye"></i> 查看重复IP</div><div class="feature"><i class="fas fa-copy"></i> 一键复制</div><div class="feature"><i class="fas fa-ban"></i> IP段过滤</div></div></header><div class="main-content"><div class="input-section"><h2 class="section-title"><i class="fas fa-paste"></i> 粘贴文本内容</h2><textarea id="inputText" placeholder="在此处粘贴包含IP地址和域名的文本...">访问我们的网站:www.example.com 或 example.org
服务器IP:192.168.1.1 和 10.0.0.1
测试域名:sub.domain.co.uk, another.test.com
重复IP:42.236.17.33 和 42.236.17.33
其他IP:111.225.149.56, 182.98.61.12, 38.207.178.220测试误识别情况:
文件:202408.rar (不应被识别为域名)
文件:report2024.pdf (不应被识别)
合法域名:123domain.com (应该被识别)更多重复测试:
192.168.1.1 再次出现
10.0.0.1 和 10.0.0.1 是重复的
42.236.17.33 第三次出现</textarea><div class="filter-info segment-info"><i class="fas fa-info-circle"></i><span>IP段过滤:输入IP的A段数字(如192、10、172)来过滤特定IP段</span></div><div class="segment-filter-container"><input type="text" id="segmentInput" class="segment-input" placeholder="输入IP的A段(如192、10、172)"><button id="filterSegmentBtn" class="btn btn-purple"><i class="fas fa-ban"></i> 过滤IP段</button></div><!-- 被过滤的IP段地址显示区域 - 移动到这里 --><div id="filteredIpsContainer" class="filtered-ips-container"><div class="filtered-ips-header"><span><i class="fas fa-ban"></i> 被过滤的IP段地址</span><span id="filteredCount" class="filtered-count">0个过滤</span></div><div id="filteredIpsContent" class="filtered-ips-content"><div class="empty-message">没有过滤IP地址</div></div></div><div class="button-group"><button id="extractBtn" class="btn btn-primary"><i class="fas fa-magic"></i> 提取IP和域名</button><button id="clearBtn" class="btn btn-secondary"><i class="fas fa-trash-alt"></i> 清除内容</button></div></div><div class="output-section"><div class="ip-results"><div class="box-header"><div class="results-header-container"><h2 class="section-title"><i class="fas fa-globe"></i> IP地址 <span id="ipCount" class="counter">0</span></h2><div class="action-buttons"><button id="showDuplicatesBtn" class="copy-btn btn-orange"><i class="fas fa-eye"></i> 显示重复IP</button><button id="copyIpBtn" class="copy-btn"><i class="fas fa-copy"></i> 复制所有</button></div></div></div><div class="results-box"><div id="ipResults" class="results-content"><div class="empty-message">提取的IP地址将显示在这里<br><small>重复IP将被完全移除</small></div></div></div><!-- 重复IP列表容器 --><div id="duplicateIpsContainer" class="duplicate-ips-container"><div class="duplicate-ips-header"><span><i class="fas fa-exclamation-circle"></i> 被过滤的重复IP地址</span><span id="duplicateCount" class="duplicate-count">0个重复</span></div><div id="duplicateIpsContent" class="duplicate-ips-content"><div class="empty-message">没有重复IP地址</div></div></div></div><div class="domain-results"><div class="box-header"><div class="top-controls"><h2 class="section-title"><i class="fas fa-server"></i> 域名 <span id="domainCount" class="counter">0</span></h2><button id="copyDomainBtn" class="copy-btn"><i class="fas fa-copy"></i> 复制所有域名</button></div></div><div class="results-box"><div id="domainResults" class="results-content"><div class="empty-message">提取的域名将显示在这里<br><small>保留唯一的域名</small></div></div></div></div></div></div></div><div id="notification" class="notification"><i class="fas fa-check-circle"></i><span id="notificationText">已复制到剪贴板!</span></div><script>document.addEventListener('DOMContentLoaded', function() {// DOM元素const inputText = document.getElementById('inputText');const extractBtn = document.getElementById('extractBtn');const clearBtn = document.getElementById('clearBtn');const ipResults = document.getElementById('ipResults');const domainResults = document.getElementById('domainResults');const copyIpBtn = document.getElementById('copyIpBtn');const copyDomainBtn = document.getElementById('copyDomainBtn');const ipCount = document.getElementById('ipCount');const domainCount = document.getElementById('domainCount');const notification = document.getElementById('notification');const notificationText = document.getElementById('notificationText');const modeToggle = document.getElementById('modeToggle');const modeIndicator = document.getElementById('modeIndicator');const showDuplicatesBtn = document.getElementById('showDuplicatesBtn');const duplicateIpsContainer = document.getElementById('duplicateIpsContainer');const duplicateIpsContent = document.getElementById('duplicateIpsContent');const duplicateCount = document.getElementById('duplicateCount');const filteredIpsContainer = document.getElementById('filteredIpsContainer');const filteredIpsContent = document.getElementById('filteredIpsContent');const filteredCount = document.getElementById('filteredCount');const segmentInput = document.getElementById('segmentInput');const filterSegmentBtn = document.getElementById('filterSegmentBtn');let uniqueMode = true; // 默认开启唯一IP模式let duplicatesMap = new Map(); // 存储重复IP及其出现次数let filteredMap = new Map(); // 存储过滤的IP及其出现次数let showDuplicates = false; // 是否显示重复IP列表let showFiltered = false; // 是否显示过滤IP列表let currentFilterSegment = ''; // 当前过滤的IP段let extractedIPs = []; // 存储提取的IPs// 切换IP处理模式modeToggle.addEventListener('click', function() {uniqueMode = !uniqueMode;if (uniqueMode) {modeIndicator.classList.remove('off');modeToggle.querySelector('span').textContent = '唯一IP模式';showNotification('唯一IP模式:完全移除重复IP', false);} else {modeIndicator.classList.add('off');modeToggle.querySelector('span').textContent = '传统去重模式';showNotification('传统去重模式:重复IP保留一个实例', true);}// 隐藏重复IP列表showDuplicates = false;duplicateIpsContainer.classList.remove('show');showDuplicatesBtn.innerHTML = '<i class="fas fa-eye"></i> 显示重复IP';// 如果有文本内容,重新运行提取if (inputText.value.trim()) {extractBtn.click();}});// 切换显示重复IP列表showDuplicatesBtn.addEventListener('click', function() {showDuplicates = !showDuplicates;if (showDuplicates) {duplicateIpsContainer.classList.add('show');this.innerHTML = '<i class="fas fa-eye-slash"></i> 隐藏重复IP';} else {duplicateIpsContainer.classList.remove('show');this.innerHTML = '<i class="fas fa-eye"></i> 显示重复IP';}});// 过滤IP段filterSegmentBtn.addEventListener('click', function() {const segment = segmentInput.value.trim();if (!segment) {showNotification('请输入要过滤的IP段', true);return;}if (!/^\d{1,3}$/.test(segment)) {showNotification('请输入有效的IP段(1-3位数字)', true);return;}currentFilterSegment = segment;// 重新应用过滤if (extractedIPs.length > 0) {applySegmentFilter(extractedIPs, segment);showNotification(`已过滤所有以 ${segment} 开头的IP地址`, 'filtered');// 显示过滤IP列表showFiltered = true;filteredIpsContainer.classList.add('show');} else {showNotification('请先提取IP地址', true);}});// 提取IP和域名extractBtn.addEventListener('click', function() {const text = inputText.value;if (!text.trim()) {showNotification('请先输入文本内容', true);return;}// 提取IP地址 (IPv4格式)const ipRegex = /\b(?:\d{1,3}\.){3}\d{1,3}\b/g;const ipMatches = text.match(ipRegex) || [];// 重置重复IP映射duplicatesMap = new Map();filteredMap = new Map();// 存储原始提取的IPsextractedIPs = [...ipMatches];// 按模式处理IPlet uniqueIPs;if (uniqueMode) {// 唯一IP模式:完全移除重复IPconst ipCountMap = new Map();// 计数每个IP出现的次数ipMatches.forEach(ip => {ipCountMap.set(ip, (ipCountMap.get(ip) || 0) + 1);});// 只保留出现一次的唯一IPuniqueIPs = ipMatches.filter(ip => ipCountMap.get(ip) === 1);// 收集重复IP及其出现次数ipCountMap.forEach((count, ip) => {if (count > 1) {duplicatesMap.set(ip, count);}});} else {// 传统模式:去重保留唯一IPuniqueIPs = [...new Set(ipMatches)];// 在传统模式下也收集重复IP信息用于显示const ipCountMap = new Map();ipMatches.forEach(ip => {ipCountMap.set(ip, (ipCountMap.get(ip) || 0) + 1);});ipCountMap.forEach((count, ip) => {if (count > 1) {duplicatesMap.set(ip, count);}});}// 应用IP段过滤(如果有)if (currentFilterSegment) {uniqueIPs = applySegmentFilter(uniqueIPs, currentFilterSegment);}// 更新重复IP列表updateDuplicateIPsList();// 增强版域名提取 - 避免误识别文件名// 匹配标准域名格式,排除纯数字前缀的情况const domainRegex = /\b(?:[a-z][a-z0-9-]*\.)+[a-z]{2,}\b/gi;const rawDomains = text.match(domainRegex) || [];// 进一步过滤结果:排除纯数字前缀的"域名"(如202408.rar)const domains = [...new Set(rawDomains.filter(domain => {// 获取域名第一部分(排除TLD)const parts = domain.split('.');const mainPart = parts.slice(0, -1).join('');// 如果主要部分只包含数字,则排除(很可能是文件名)return !/^\d+$/.test(mainPart);}))];// 显示结果displayResults(uniqueIPs, ipResults, ipCount, 'ip', ipMatches);displayResults(domains, domainResults, domainCount, 'domain');});// 应用IP段过滤function applySegmentFilter(ips, segment) {// 重置过滤映射filteredMap = new Map();// 过滤掉以指定段开头的IPconst filteredIPs = ips.filter(ip => {if (ip.startsWith(segment + '.')) {// 记录被过滤的IPfilteredMap.set(ip, (filteredMap.get(ip) || 0) + 1);return false;}return true;});// 更新过滤IP列表updateFilteredIPsList();// 重新显示结果displayResults(filteredIPs, ipResults, ipCount, 'ip', extractedIPs);return filteredIPs;}// 更新重复IP列表function updateDuplicateIPsList() {duplicateIpsContent.innerHTML = '';if (duplicatesMap.size === 0) {duplicateIpsContent.innerHTML = '<div class="empty-message">没有重复IP地址</div>';duplicateCount.textContent = '0个重复';return;}duplicateCount.textContent = `${duplicatesMap.size}个重复`;// 按重复次数排序(从高到低)const sortedDuplicates = [...duplicatesMap.entries()].sort((a, b) => b[1] - a[1]);sortedDuplicates.forEach(([ip, count]) => {const duplicateItem = document.createElement('div');duplicateItem.className = 'duplicate-ip-item';duplicateItem.innerHTML = `<span>${ip}</span><div class="duplicate-count">出现 ${count} 次</div>`;duplicateIpsContent.appendChild(duplicateItem);});}// 更新过滤IP列表function updateFilteredIPsList() {filteredIpsContent.innerHTML = '';if (filteredMap.size === 0) {filteredIpsContent.innerHTML = '<div class="empty-message">没有过滤IP地址</div>';filteredCount.textContent = '0个过滤';return;}filteredCount.textContent = `${filteredMap.size}个过滤`;// 按IP地址排序const sortedFiltered = [...filteredMap.entries()].sort((a, b) => a[0].localeCompare(b[0]));sortedFiltered.forEach(([ip, count]) => {const filteredItem = document.createElement('div');filteredItem.className = 'filtered-ip-item';filteredItem.innerHTML = `<span>${ip}</span><div class="filtered-count">出现 ${count} 次</div>`;filteredIpsContent.appendChild(filteredItem);});}// 显示结果函数function displayResults(items, container, counter, type, originalItems = []) {container.innerHTML = '';if (items.length === 0) {container.innerHTML = `<div class="empty-message">未找到${type === 'ip' ? 'IP地址' : '域名'}</div>`;counter.textContent = '0';counter.className = 'counter';return;}counter.textContent = items.length;// 添加警告样式如果是IP模式且有移除if (type === 'ip' && uniqueMode && originalItems.length > items.length) {counter.className = 'counter warning';} else if (type === 'ip' && filteredMap.size > 0) {counter.className = 'counter filtered';} else {counter.className = 'counter';}items.forEach(item => {const resultItem = document.createElement('div');resultItem.className = 'result-item';// 标记重复项(在传统模式下)const isDuplicate = type === 'ip' && !uniqueMode && originalItems.filter(ip => ip === item).length > 1;// 标记被过滤项const isFiltered = type === 'ip' && filteredMap.has(item);if (isDuplicate) {resultItem.classList.add('duplicate');} else if (isFiltered) {resultItem.classList.add('filtered');}resultItem.innerHTML = `<span>${item}</span><i class="fas fa-copy copy-icon" data-value="${item}"></i>`;container.appendChild(resultItem);});// 添加单个条目的复制功能container.querySelectorAll('.copy-icon').forEach(icon => {icon.addEventListener('click', function() {const value = this.getAttribute('data-value');copyToClipboard(value, '已复制: ' + value);});});}// 复制IP地址copyIpBtn.addEventListener('click', function() {const ips = Array.from(ipResults.querySelectorAll('.result-item span')).map(span => span.textContent).join('\n');if (ips) {copyToClipboard(ips, '已复制所有IP地址');} else {showNotification('没有可复制的IP地址', true);}});// 复制域名copyDomainBtn.addEventListener('click', function() {const domains = Array.from(domainResults.querySelectorAll('.result-item span')).map(span => span.textContent).join('\n');if (domains) {copyToClipboard(domains, '已复制所有域名');} else {showNotification('没有可复制的域名', true);}});// 清除内容clearBtn.addEventListener('click', function() {inputText.value = '';segmentInput.value = '';ipResults.innerHTML = '<div class="empty-message">提取的IP地址将显示在这里<br><small>重复IP将被完全移除</small></div>';domainResults.innerHTML = '<div class="empty-message">提取的域名将显示在这里<br><small>保留唯一的域名</small></div>';ipCount.textContent = '0';domainCount.textContent = '0';ipCount.className = 'counter';domainCount.className = 'counter';// 重置重复IP列表duplicatesMap = new Map();filteredMap = new Map();currentFilterSegment = '';updateDuplicateIPsList();updateFilteredIPsList();showDuplicates = false;showFiltered = false;duplicateIpsContainer.classList.remove('show');filteredIpsContainer.classList.remove('show');showDuplicatesBtn.innerHTML = '<i class="fas fa-eye"></i> 显示重复IP';});// 复制到剪贴板函数function copyToClipboard(text, message) {navigator.clipboard.writeText(text).then(() => {showNotification(message, false);}).catch(err => {showNotification('复制失败: ' + err, true);});}// 显示通知function showNotification(message, isWarning) {notificationText.textContent = message;notification.className = 'notification';if (isWarning === true) {notification.classList.add('warning');} else if (isWarning === 'filtered') {notification.classList.add('filtered');}notification.classList.add('show');setTimeout(() => {notification.classList.remove('show');}, 3000);}// 初始化时自动提取一次extractBtn.click();});</script>
</body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何通过日志先行原则保障数据持久化:Redis AOF 和 MySQL redo log 的对比

在分布式系统或数据库管理系统中&#xff0c;日志先行原则&#xff08;Write-Ahead Logging&#xff0c;WAL&#xff09; 是确保数据一致性、持久性和恢复能力的重要机制。通过 WAL&#xff0c;系统能够在发生故障时恢复数据&#xff0c;保证数据的可靠性。在这篇博客中&#x…

临床研究三千问——临床研究体系的3个维度(8)

在上周的文章中&#xff0c;我们共同探讨了1345-10战策的“临床研究的起点——如何提出一个犀利的临床与科学问题”。问题固然是灵魂&#xff0c;但若没有坚实的骨架与血肉&#xff0c;灵魂便无所依归。今天&#xff0c;我们将深入“1345-10战策”中的“3”&#xff0c;即支撑起…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年9月7日第172弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。(1)定位…

万字详解网络编程之socket

一&#xff0c;socket简介1.什么是socketsocket通常也称作"套接字"&#xff0c;⽤于描述IP地址和端⼝&#xff0c;是⼀个通信链的句柄&#xff0c;应用程序通常通过"套接字"向⽹络发出请求或者应答⽹络请求。⽹络通信就是两个进程间的通信&#xff0c;这两…

维度跃迁:当万物皆成电路,智能将从“拥有”变为“存在”

我们习以为常的电子世界&#xff0c;其本质是一个由电路构成的精密宇宙。而一场从二维到三维的终极变革&#xff0c;正在悄然酝酿&#xff0c;它将彻底颠覆我们创造和交互的方式。一、电子世界的本质&#xff1a;一切都是电路 在深入未来之前&#xff0c;我们首先要理解当下。电…

大语言模型预训练数据采集与清洗技术实践:从语料到知识库的全流程优化

大语言模型(LLM)的性能上限由 “数据质量 数据规模 数据多样性” 共同决定 —— 预训练阶段的海量语料决定模型的泛化能力与语言理解基础,而知识库数据则决定模型的知识准确性与领域专业性。当前 LLM 落地面临的核心痛点之一,便是 “数据脏、处理难、知识杂”:预训练语料…

模拟音频采集设备的制作

模拟音频程序与设备的制作 需要设备 esp32s3 pcm1808 pcm5102(非必须) 程序界面 程序代码 代码链接

Java Modbus通信实战(四):Modbus通信测试与故障排查

在工业现场&#xff0c;设备通信系统就像工厂的神经网络&#xff0c;连接着各种传感器、控制器和执行器。当你搭建好这套系统后&#xff0c;最关键的一步就是全面测试&#xff0c;确保每个环节都能正常工作。 就像汽车出厂前要经过严格的路试一样&#xff0c;Modbus RTU通信系统…

少儿编程C++快速教程之——1. 基础语法和输入输出

1. 欢迎来到C编程世界&#xff01; 1.1 什么是编程&#xff1f; 编程就像是给计算机写一份详细的"说明书"&#xff0c;告诉它该做什么、怎么做。C是一种强大的编程语言&#xff0c;可以用来创建游戏、应用程序和各种有趣的软件&#xff01; 1.2 第一个C程序&#xff…

arma::imat22

arma::imat22 是 Armadillo C 线性代数库中定义的一个固定大小的 2x2 有符号整数矩阵类型。它主要用于处理小型、维度在编译时已知的整数矩阵&#xff0c;因其在栈上分配内存&#xff0c;故通常比动态矩阵有更高的效率。 下面是一个汇总了 arma::imat22 主要特性的表格&#xf…

狗都能看懂的HunYuan3D 1.0详解

HunYuan3D 1.0 HunYuan3D 1.0是2024年9月发布的一篇论文。虽然站在现在的时间节点&#xff0c;HunYuan3D系列已经出到2.5了&#xff0c;但是1.0版本的改进思路&#xff0c;和它trick集成的做法&#xff0c;还是很值得学习的。由于文章用到了很多技术&#xff0c;由于篇幅有限&a…

踏脚迈入奇幻乐园

每天早上上班的路上都会经过一个小花园。它被夹在丁字路口的拐角&#xff0c;面积不大&#xff0c;匆匆而过的行人都不会注意到它。但如果顺着几个不起眼的入口走进去&#xff0c;里面却是别有洞天。清早的街道还没有车水马龙的喧哗&#xff0c;花园里静悄悄的。各式各样的花草…

内存越界引发线程函数调用堆栈回溯异常以及INT 3软中断实战分析案例分享

目录 1、问题说明 2、导出dump文件时只是遇到了INT 3软中断&#xff0c;并没有发生异常崩溃 3、函数中发生了栈内存越界&#xff0c;导致线程的栈回溯出异常&#xff0c;堆栈中只显示一行函数调用记录 3.1、处理Json数据时产生了异常 3.2、函数中发生栈内存越界&#xff0…

LeetCode 240: 搜索二维矩阵 II - 算法详解(秒懂系列

文章目录LeetCode 240: 搜索二维矩阵 II - 算法详解题目描述Java解决方案算法思路核心理念为什么选择右上角&#xff1f;可视化演示过程示例1&#xff1a;查找 target 5示例2&#xff1a;查找 target 20 (不存在)算法分析时间复杂度空间复杂度算法优势关键要点扩展思考LeetCo…

洛谷 B4071 [GESP202412 五级] 武器强化

思考难度低&#xff0c;但是代码难度相对较高的题&#xff0c;故做个记录。首先&#xff0c;题目说了要花费最少的钱&#xff0c;所以我们每次拿最便宜的材料给武器1思想&#xff1a;每次都拿最便宜的材料然后考虑一下这个思想是否正确&#xff0c;找一下反例&#xff0c;每次拿…

SQL工具30年演进史:从Oracle到Navicat、DBeaver,再到Web原生SQLynx

目录 一、1990s&#xff1a;厂商自带的数据库工具时代 二、2000s&#xff1a;Navicat等商业数据库管理工具崛起 三、2010s&#xff1a;DBeaver等开源SQL工具兴起 四、2020s&#xff1a;SQLynx&#xff0c;Web原生数据库管理工具 五、SQL工具30年时间线对比 六、总结&…

C语言制作扫雷游戏(拓展版赋源码)

目录 引言&#xff1a; 三个新功能实现 1.可以选择难度或自定义 实现难点解析 代码实现&#xff08;附源码&#xff09; 扫雷.c game.h game.c 2.对选择位置进行标记或取消标记 一.框架 我们先理一下思路 如何构造框架 二.取消标记函数 三.标记函数 四.加入清屏&#xff0c;进…

Python快速入门专业版(十):字符串特殊操作:去除空格、判断类型与编码转换

目录引1.去除空格&#xff1a;清理字符串的实用技巧1.1 三类去空格方法&#xff1a;strip()、lstrip()、rstrip()1.2 实战案例&#xff1a;处理用户输入的空格问题2.判断类型&#xff1a;验证字符串内容的特性2.1 常用类型判断方法2.2 实战案例&#xff1a;验证用户输入的合法性…

Gamma AI:AI演示文稿制作工具,高效解决PPT框架搭建难与排版耗时问题

你做 PPT 的时候是不是也常陷入 “两难”&#xff1f;要么对着空白幻灯片发呆&#xff0c;不知道怎么搭框架 —— 比如要做 “产品季度迭代复盘”&#xff0c;既想放数据又想讲问题&#xff0c;结果页面堆得像乱炖&#xff1b;要么好不容易凑完内容&#xff0c;又花两小时调排版…

【应用案例】AI 给医用过滤器 “找茬”:3 大难点 + 全流程解决方案

【应用案例】AI 给医用过滤器 “找茬”&#xff1a;3 大难点 全流程解决方案&#x1f3af;医用过滤器进行医疗AI检测&#x1f3af;先看痛点&#xff1a;医用过滤器检测难在哪&#xff1f;&#x1f3af;AI检测方案&#xff1a;3步实现“零漏检”1. 硬件定制&#xff1a;让缺陷“…