懒人福音 省去复制粘贴 B 站链接转换脚本

查看 13|回复 0
作者:icelei   
起因
在浏览帖子时经常遇到某站的视频 id ,想进一步看是什么视频的时候都要通过 复制→进入视频网站→粘贴并回车 这样一个过程才能完成。作为一个懒人,想直接可以点击访问,于是有了这个脚本。
主要功能
将页面中的某站视频 ID ( BV 号或 av 号)转换为可点击链接
代码如下
// ==UserScript==
// @name         B 站链接转换器
// @namespace    [email protected]
// @version      0.1
// @description  将页面中的 B 站视频 ID ( BV 号或 av 号)转换为可点击链接
// @author       iceLei
// @match        *://*/*
// @grant        none
// ==/UserScript==
(function() {
    'use strict';
    function replaceIdsWithLinks() {
        const pattern = /(?:BV[0-9A-Za-z]{10,}|av\d+)/g;
        
        // 递归处理文本节点
        function walk(node) {
            if (node.nodeType === 3) { // 文本节点
                const text = node.nodeValue;
                const matches = text.match(pattern);
                if (matches) {
                    const fragment = document.createDocumentFragment();
                    let lastIndex = 0;
                    
                    text.replace(pattern, (match, index) => {
                        // 添加匹配前的文本
                        fragment.appendChild(document.createTextNode(text.slice(lastIndex, index)));
                        
                        // 创建链接元素
                        const link = document.createElement('a');
                        link.href = `https://www.bilibili.com/video/${match}`;
                        link.textContent = match;
                        link.target = '_blank';
                        link.style.color = '#FB7299'; // B 站粉色
                        link.style.textDecoration = 'underline';
                        
                        fragment.appendChild(link);
                        lastIndex = index + match.length;
                    });
                    
                    // 添加剩余文本
                    fragment.appendChild(document.createTextNode(text.slice(lastIndex)));
                    
                    // 替换原节点
                    node.parentNode.replaceChild(fragment, node);
                }
            } else if (node.nodeType === 1 && node.tagName !== 'A') { // 元素节点且不是链接
                // 递归处理子节点
                Array.from(node.childNodes).forEach(walk);
            }
        }
        
        walk(document.body);
    }
    // 执行替换
    replaceIdsWithLinks();
})();
您需要登录后才可以回帖 登录 | 立即注册

返回顶部