Greasy Fork

Greasy Fork is available in English.

bilibili网页视频简介中的链接可以点击

增加bilibili网页视频简介文字的交互,部分网页链接、社交平台跳转、邮箱跳转、视频时间跳转、B站直播间跳转、微信号和群号可扫二维码录入手机、百度盘4位密码点击复制

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

You will need to install an extension such as Tampermonkey to install this script.

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name                bilibili网页视频简介中的链接可以点击
// @namespace           http://greasyfork.icu/zh-CN/scripts/409881
// @version             3.2
// @description         增加bilibili网页视频简介文字的交互,部分网页链接、社交平台跳转、邮箱跳转、视频时间跳转、B站直播间跳转、微信号和群号可扫二维码录入手机、百度盘4位密码点击复制
// @description:en      black to blue!
// @author              beibeibeibei
// @match               *.bilibili.com/video/*
// @grant               GM_setClipboard
// @require             https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js
// @require             https://cdn.jsdelivr.net/npm/kjua/dist/kjua.min.js
// ==/UserScript==

(function () {
    'use strict';
    let $ = jQuery.noConflict(); // line11   https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js
    let QR = kjua; //////////////// line12   https://cdn.jsdelivr.net/npm/kjua/dist/kjua.min.js


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////22到199行都是识别规则////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    //可以点击
    /*  0A*/ let URLreg = /([hH][tT]{2}[pP]([sS]?):\/\/|[wW]{3}.|[wW][aA][pP].|[fF][tT][pP].|[bB]{2}[sS].|[nN][eE][wW][sS].|[bB][lL][oO][gG].)[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]/;
    function url2URL(urlstr) {
        let url = urlstr;
        if(urlstr.substring(0,4) != "http"){
            url = "https://" + urlstr;
        }
        return '<a target="_blank" href="' + url + '">' + urlstr + '</a>';
    }
    /*  0B*/ let shorturl = /(?<!https?:\/\/[a-zA-Z0-9]*)([a-zA-Z0-9]+\.)?[a-zA-Z\-]+\.(co(m)?|COM(\.CN)|net|wiki)([-\/a-zA-Z0-9\._?=&]?)+/;
    function url2URL2(url) {
        return '<a target="_blank" href="https://' + url + '">' + url + '</a>';
    }
    /*  1A*/ let BVlink = /(?<![hH][tT]{2}[pP][sS]?:\/\/www.bilibili.com\/video\/)(bv|BV)[A-Za-z0-9]{10}/;
    function BVnum2BVlink(BVnum) {
        return '<a target="_blank" href="//www.bilibili.com/video/' + BVnum + '">' + BVnum + '</a>';
    }
    /*  1B*/ let avlink = /(?<![hH][tT]{2}[pP][sS]?:\/\/www.bilibili.com\/video\/)av[0-9]+/;
    function avnum2avlink(AVnum) {
        return '<a target="_blank" href="//www.bilibili.com/video/' + AVnum + '">' + AVnum + '</a>';
    }
    /*  1C*/ let cvlink = /(?<![hH][tT]{2}[pP][sS]?:\/\/www.bilibili.com\/read\/)cv[1-9][0-9]*/;
    function cvnum2cvlink(cvnum) {
        return '<a target="_blank" href="//www.bilibili.com/read/' + cvnum + '/">' + cvnum + '</a>';
    }
    /*  1D*/ let smlink = /(?<![hH][tT]{2}[pP][sS]?:\/\/www.nicovideo.jp\/watch\/)sm[0-9]+/;
    function smnum2smlink(smnum) {
        return '<a target="_blank" href="http://acg.tv/' + smnum + '/">' + smnum + '</a>';
    }
    /*  1E*/ let bilibililivelink = /([bB]站(小号)?|哔哩哔哩|bilibili|Bilibili)(直播|房)间((房)?号(码)?)?(:|:|——)?[0-9]+|B站[0-9]+直播间|直播间就在b站!房间号:[0-9]+|直播间:B站[0-9]+|哔哩哔哩每(周(一|二|三|四|五|六|日)( )?)+直播( )?房间号( )?[0-9]+/;
    function livestr2livelink(livestr) {
        let livenum = livestr.match(/(?<=([bB]站(小号)?|哔哩哔哩|bilibili|Bilibili)(直播|房)间((房)?号(码)?)?(:|:|——)?)[0-9]+|(?<=[bB]站)[0-9]+(?=直播间)|(?<=直播间就在b站!房间号:)[0-9]+|(?<=直播间:B站)[0-9]+|(?<=哔哩哔哩每(周(一|二|三|四|五|六|日)( )?)+直播( )?房间号( )?)[0-9]+/)[0];
        return '<a target="_blank" href="https://live.bilibili.com/' + livenum + '/">' + livestr + '</a>';
    }
    /*  2A*/ let weibo1 = /((新浪)?(微|官)博(已更名为|名|ID)?|围脖)(@|@|@ | @|:|:@|: @| \| |:|: |:        )[\-0-9A-Z_a-z\u4e00-\u9fa5]{2,30}/;
    function wbstr2wblink1(wbstr) {
        let wb = wbstr.match(/(?<=((新浪)?(微|官)博(已更名为|名|ID)?|围脖)(@|@|@ | @|:|:@|: @| \| |:|: |:        ))[\-0-9A-Z_a-z\u4e00-\u9fa5]{2,30}/)[0];
        return '<a target="_blank" href="https://s.weibo.com/user?q=' + wb + '&amp;Refer=weibo_user">' + wbstr + '</a>';
    }
    /*  2B*/ let weibo2 = /(微博【)[\-0-9A-Z_a-z\u4e00-\u9fa5]{2,30}(】)/;
    function wbstr2wblink2(wbstr) {
        let wb = wbstr.match(/(?<=微博【)[\-0-9A-Z_a-z\u4e00-\u9fa5]{2,30}(?=】)/)[0];
        return '<a target="_blank" href="https://s.weibo.com/user?q=' + wb + '&amp;Refer=weibo_user">' + wbstr + '</a>';
    }
    /*  2C*/ let weibo3 = /(@|@|:|:@)[\-0-9A-Z_a-z\u4e00-\u9fa5]{3,30}( 的微博)/;
    function wbstr2wblink3(wbstr) {
        let wb = wbstr.match(/(?<=(@|@|:|:@))[\-0-9A-Z_a-z\u4e00-\u9fa5]{3,30}(?= 的微博)/)[0];
        return '<a target="_blank" href="https://s.weibo.com/user?q=' + wb + '&amp;Refer=weibo_user">' + wbstr + '</a>';
    }
    /*  3 */ let youtube = /(youtube|YouTube|Youtube|油管)(频道| ID)?[:|:| ] ?(?!快手)[\-0-9A-Z_a-z\u4e00-\u9fa5【】']+/;
    function ytb2ytblink(ytbstr) {
        let ytb = ytbstr.match(/(?<=(youtube|YouTube|Youtube|油管)(频道| ID)?[:|:| ] ?)[\u4e00-\u9fa5【】']+/)[0];
        return '<a target="_blank" href="https://www.youtube.com/results?search_query=' + ytb + '">' + ytbstr + '</a>';
    }
    //显示二维码,将字符串扫入手机
    /*  4A*/ let WeChat1 = /(联系|添加|群主|客服|工作|我的)微信:?[0-9A-Za-z\u4e00-\u9fa5]+|微信搜一搜:[0-9A-Za-z\u4e00-\u9fa5]+|微信小程序:搜索“[0-9A-Za-z\u4e00-\u9fa5]+”|WX加[0-9A-Za-z\u4e00-\u9fa5]+入群/;
    function wechat2qr1(wechatstr) {
        let wechat = wechatstr.match(/(?<=(联系|添加|群主|客服|工作|我的)微信:?)[0-9A-Za-z\u4e00-\u9fa5]+|(?<=微信搜一搜:)[0-9A-Za-z\u4e00-\u9fa5]+|(?<=微信小程序:搜索“)[0-9A-Za-z\u4e00-\u9fa5]+(?=”)|(?<=WX加)[0-9A-Za-z\u4e00-\u9fa5]+(?=入群)/)[0];
        return '<a class="qrtampermonkey" value="' + wechat + '">' + wechatstr + '</a>';
    }
    /*  4B*/ let WeChat2 = /【联系微信:[0-9A-Za-z\u4e00-\u9fa5]+,非诚勿扰】/;
    function wechat2qr2(wechatstr) {
        let wechat = wechatstr.match(/(?<=【联系微信:)[0-9A-Za-z\u4e00-\u9fa5]+(?=,非诚勿扰】)/)[0];
        return '<a class="qrtampermonkey" value="' + wechat + '">' + wechatstr + '</a>';
    }
    /*  4C*/ let WeChatOfficial1 = /(微信)?公众号(:|:|:  |-)[0-9A-Za-z\u4e00-\u9fa5]{3,30}/;
    function WeChatOfficial2qr1(WeChatOfficialstr) {
        let WeChatOfficial = WeChatOfficialstr.match(/(?<=(微信)?公众号(:|:|:  |-))[0-9A-Za-z\u4e00-\u9fa5]{3,30}/)[0];
        return '<a class="qrtampermonkey" value="' + WeChatOfficial + '">' + WeChatOfficialstr + '</a>';
    }
    /*  4D*/ let WeChatOfficial2 = /(微信)?公众号【[0-9A-Za-z\u4e00-\u9fa5]{3,30}】|(微信)?公众号([0-9A-Za-z\u4e00-\u9fa5]{3,30})|(微信)?公众号“[0-9A-Za-z\u4e00-\u9fa5]{3,30}”/;
    function WeChatOfficial2qr2(WeChatOfficialstr) {
        let WeChatOfficial = WeChatOfficialstr.match(/(?<=(微信)?公众号【)[0-9A-Za-z\u4e00-\u9fa5]{3,30}(?=】)|(?<=(微信)?公众号()[0-9A-Za-z\u4e00-\u9fa5]{3,30}(?=))|(?<=(微信)?公众号“)[0-9A-Za-z\u4e00-\u9fa5]{3,30}(?=”)/)[0];
        return '<a class="qrtampermonkey" value="' + WeChatOfficial + '">' + WeChatOfficialstr + '</a>';
    }
    /*  5 */ let qqgroup = /[qQ]?[qQ]?(交流)?群(号|号码|交流|【.{0,4}】|1|⑧|⑨|⑩)?(:|~| - |: | |:|: )[0-9]+|群(交流)?[0-9]{6,}|粉丝扣扣大本营一号:[0-9]+|加群吧 【[0-9]+】|搜索QQ群:[\u4e00-\u9fa5]+|群:『[0-9]+』/;
    function qqgroupstr2qr(qqgroupstr) {
        let qqgroupnum = qqgroupstr.match(/(?<=[qQ]?[qQ]?(交流)?群(号|号码|交流|【.{0,4}】|1|⑧|⑨|⑩)?(:|~| - |: | |:|: ))[0-9]{6,}|(?<=群(交流)?)[0-9]{6,}|(?<=粉丝扣扣大本营一号:)[0-9]+|(?<=加群吧 【)[0-9]+(?=】)|(?<=搜索QQ群:)[\u4e00-\u9fa5]+|(?<=群:『)[0-9]+(?=』)/)[0];
        return '<a class="qrtampermonkey" value="' + qqgroupnum + '">' + qqgroupstr + '</a>';
    }
    //其他
    //邮箱链接
    let mailaddress = /[0-9A-Za-z_\-]+@(qq|163|126|gmail|outlook|foxmail|aliyun|rd.netease|global-link-m|bigdongdong).com/;
    /*  6 */ let mail = RegExp(/(商务)?(合作)?(联系)?邮箱(:|:|::| |:\n)?/.source + mailaddress.source + /|/.source + /商务/.source + mailaddress.source + /|/.source + /(zfb|來信)(:|: )/.source + mailaddress.source);
    function mailstr2mail(mailaddressstr) {
        let mail = mailaddressstr.match(RegExp(/(?<=(商务)?(合作)?(联系)?邮箱(:|:|::| )?)/.source + mailaddress.source + /|/.source + /(?<=商务)/.source + mailaddress.source + /|/.source + /(?<=(zfb|來信)(:|: ))/.source + mailaddress.source))[0];
        return '<a href="mailto:' + mail + '">' + mailaddressstr + '</a>';
    }
    //时间跳转
    /*  7 */ let videotime1 = /(?<!(上午|下午|日|开播时间:[0-9]{2}:[0-9]{2}-|:)[0-9]?)[0-9]+:[0-9]{2}(?![0-9])(?!(:|左右开始到凌晨))/; //时间数字串,修改视频进度条 //暂时还不支持3个冒号的???
    function changevideotime1(time){
        let text = time.split(":");
        let value = text[0] * 60 + text[1] * 1;
        return '<a class="timetampermonkey" value="' + value + '">' + time + '</a>';
    }
    /*  8 */ let videotime2 = /(?<!(前|长按|命运)[0-9]?)([0-9]{1,2}分[0-9]{1,2}秒|[0-9]{1,2}分|[0-9]{1,2}秒)(?!神剧|忍者)/; //时间数字文字组合串,修改视频进度条
    function changevideotime2(time) {
        let timetest_m_s = time.split(/[分秒]/);
        let timetest_m = time.split(/[分]/);
        let timetest_s = time.split(/[秒]/);
        let value = 0;
        if (timetest_m_s.toString() == timetest_m.toString()) { // 例子:2分
            value = timetest_m[0] * 60;
        } else if (timetest_m_s.toString() == timetest_s.toString()) { // 例子:2秒
            value = timetest_s[0] * 1;
        } else { // 剩下的就是分秒都有 例子:1分01秒
            value = timetest_m_s[0] * 60 + timetest_m_s[1] * 1;
        }
        return '<a class="timetampermonkey" value="' + value + '">' + time + '</a>';
    }
    //密码点击复制
    /*  9 */ let four_digit_password = /密码(:|: )[0-9a-z]{4}/;
    function copy_password(text) {
        let password = text.match(/(?<=密码(:|: ))[0-9a-z]{4}/)[0];
        return '<a class="copytampermonkey" title="点击复制" value="' + password + '">' + text + '</a>';
    }
    //删除重复文字 //修复up主口吃的问题
    /* 10A*/ let repeatWORD1 = /(三连( )?|三连啊|求三连|求三连!!!|三连~|三连我!|一件三连叭~~~|三连点赞!!!!!|三连关注!|关注|求关注|求关注!!!|关注我!|评论我!|收藏( )?|不要白嫖!|不要白嫖!!!!|求求惹~|舒服了|\n\n\n|啊啊啊|给个赞吧)\1+/;
    function NOrepeat1(repeatstr) {
        repeatstr.match(new RegExp(repeatWORD1));
        return RegExp.$1;
    }
    /* 10B*/ let repeatWORD2 = /(三)\1+(连)/;
    function NOrepeat2(repeatstr) {
        repeatstr.match(new RegExp(repeatWORD2));
        return RegExp.$1 + RegExp.$2;
    }
    /* 10C*/ let repeatWORD3 = /(关)\1+(注)(?!注)/;
    function NOrepeat3(repeatstr) {
        repeatstr.match(new RegExp(repeatWORD3));
        return RegExp.$1 + RegExp.$2;
    }
    /* 10D*/ let repeatWORD4 = /(关)\1+(注)\2+/;
    function NOrepeat4(repeatstr) {
        repeatstr.match(new RegExp(repeatWORD3));
        return RegExp.$1 + RegExp.$2;
    }
    /* 10E*/ let repeatWORD5 = /(三连一定|一键三连哦|关注)(!)\2+/;
    function NOrepeat5(repeatstr) {
        repeatstr.match(new RegExp(repeatWORD3));
        return RegExp.$1 + RegExp.$2;
    }

    let R = [
        /*  0A*/[URLreg, url2URL],
        /*  0B*/[shorturl, url2URL2],
        /*  1A*/[BVlink, BVnum2BVlink],
        /*  1B*/[avlink, avnum2avlink],
        /*  1C*/[cvlink, cvnum2cvlink],
        /*  1D*/[smlink, smnum2smlink],
        /*  1E*/[bilibililivelink, livestr2livelink],
        /*  2A*/[weibo1, wbstr2wblink1],
        /*  2B*/[weibo2, wbstr2wblink2],
        /*  2C*/[weibo3, wbstr2wblink3],
        /*  3 */[youtube, ytb2ytblink],
        /*  4A*/[WeChat1, wechat2qr1],
        /*  4B*/[WeChat2, wechat2qr2],
        /*  4C*/[WeChatOfficial1, WeChatOfficial2qr1],
        /*  4D*/[WeChatOfficial2, WeChatOfficial2qr2],
        /*  5 */[qqgroup, qqgroupstr2qr],
        /*  6 */[mail, mailstr2mail],
        /*  7 */[videotime1, changevideotime1],
        /*  8 */[videotime2, changevideotime2],
        /*  9 */[four_digit_password, copy_password],
        /* 10A*/[repeatWORD1, NOrepeat1],
        /* 10B*/[repeatWORD2, NOrepeat2],
        /* 10C*/[repeatWORD3, NOrepeat3],
        /* 10D*/[repeatWORD4, NOrepeat4],
        /* 10E*/[repeatWORD5, NOrepeat5],
    ];


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////199行////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    function core(text, REG) {
        function 获取正则匹配结果(文本, 正则, 处理函数, 结果组) {
            if (正则 === undefined) {
                return false;
            }
            let Reg = new RegExp(正则.source, "g");//每次都是新正则,避免lastIndex问题
            //命中正则
            let result;
            while (result = Reg.exec(文本)) {//命中一次正则,添加一个结果组
                //console.log("匹配文本为:" + result[0] + " 位置为:" + result.index + " 下次查找的起始位置:" + Reg.lastIndex);
                结果组.push([[Reg], [处理函数], result.index, Reg.lastIndex]);
            }
        }

        //准备文本
        //let text = "江南可采莲,莲叶何田田。鱼戏莲叶间。\n鱼戏莲叶东,鱼戏莲叶西,鱼戏莲叶南,鱼戏莲叶北。";
        //准备匹配结果
        let hit_array = [];
        //准备正则组
        // let REG = [
        //     [/鱼/, function a(fish) { return '白' + fish; }],
        //     [/莲/, function b(lotus) { return '青' + lotus; }],
        //     [/莲叶/, function c(lotus_leaf) { return lotus_leaf.replace('叶', '池');; }],
        //     [/戏莲叶/, function d(play_lotus_leaf) { return '游' + play_lotus_leaf.replace('戏', '游');; }],
        // ];
        //遍历正则组,输出匹配结果到hit_array //生成0列正则列、1列处理函数列、2列和3列正则命中文本的开头位置和结尾位置
        for (let i = 0; i < REG.length; i++) {
            获取正则匹配结果(text, REG[i][0], REG[i][1], hit_array);
        }
        //排序匹配结果
        hit_array = hit_array.sort(function (x, y) { return x[2] - y[2]; }); // 列:0、1、2、3

        //标记hit_array中的冲突结果并push到clash_array中//根据标记删除hit_array中的整行冲突结果 // 列:0、1、2、3和"clash"列
        let clash_array = [];
        for (let i = 0; i < hit_array.length - 1; i++) {
            if (hit_array[i][3] > hit_array[i + 1][2]) {
                if (clash_array.indexOf(hit_array[i]) == -1) {
                    clash_array.push(hit_array[i]);
                }
                if (clash_array.indexOf(hit_array[i + 1]) == -1) {
                    clash_array.push(hit_array[i + 1]);
                }
                hit_array[i].push("clash");
                hit_array[i + 1].push("clash");
            }
        }
        for (let i = hit_array.length - 1; i > -1; i--) {
            if (hit_array[i][4] == "clash") {
                hit_array.splice(i, 1);
            }
        }
        //标记并合并clash_array中的冲突结果 //删除"clash"列并添加组合命中位置列2列
        for (let i = 0; i < clash_array.length; i++) {//删除"clash"(尾部对齐)
            clash_array[i].length = 4;
        }
        for (let i = 0; i < clash_array.length; i++) {//所有数据如果与之前有冲突,则添加冲突开头数字
            for (let j = i + 1; j < clash_array.length; j++) {
                if (clash_array[i][3] > clash_array[j][2]) {
                    clash_array[j].push(clash_array[i][2]);
                }
            }
        }
        for (let i = 0; i < clash_array.length; i++) {//第一个冲突数据,添加开头数字
            if (clash_array[i].length == 4) {
                clash_array[i].push(clash_array[i][2]);
            }
        }
        for (let i = 0; i < clash_array.length; i++) {//删除多余的数字(尾部对齐)
            if (clash_array[i].length > 5) {
                clash_array[i].length = 5;
            }
        }
        if (clash_array.length > 0) {//添加结尾数字
            let max = clash_array[clash_array.length - 1][3];
            for (let i = clash_array.length - 1; i > 0; i--) {
                clash_array[i].push(max);
                if (clash_array[i][4] != clash_array[i - 1][4]) {
                    max = clash_array[i - 1][3];
                }
            }
            clash_array[0].push(max);
        }
        //合并正则 // 0、1、正则命中列替换成组合命中列2列
        for (let i = clash_array.length - 1; i > 0; i--) {
            if (clash_array[i][4] == clash_array[i - 1][4]) {
                clash_array[i - 1][0] = clash_array[i - 1][0].concat(clash_array[i][0]);
                clash_array[i - 1][1] = clash_array[i - 1][1].concat(clash_array[i][1]);
                clash_array[i - 1][2] = clash_array[i - 1][4];
                clash_array[i - 1][3] = clash_array[i - 1][5];
                clash_array.splice(i, 1);
            }
        }
        for (let i = 0; i < clash_array.length; i++) {//删除多余的数字(尾部对齐)
            clash_array[i].length = 4;
        }

        //补全其他未命中正则的普通字符串位置 //0、1、2、3
        let result_array = hit_array.concat(clash_array).sort(function (x, y) { return x[2] - y[2]; });
        if (result_array.length == 0) {
            result_array = [[[], [], 0, text.length]];
        } else {
            if (result_array[0][2] != 0) {//补开头
                result_array.unshift([[], [], 0, result_array[0][2]]);
            }
            for (let i = result_array.length - 2; i > -1; i--) {//补中间
                if (result_array[i][3] != result_array[i + 1][2]) {
                    result_array.splice(i + 1, 0, [[], [], result_array[i][3], result_array[i + 1][2]]);
                }
            }
            if (result_array[result_array.length - 1][3] != text.length) {//补结尾
                result_array.push([[], [], result_array[result_array.length - 1][3], text.length]);
            }
        }
        //添加处理后的文本,索引4 // 0、1、2、3、4
        for (let i = 0; i < result_array.length; i++) {
            let subtext = text.substring(result_array[i][2], result_array[i][3]);
            if (result_array[i][0].length == 0) {
                result_array[i].push([subtext]);
            } else if (result_array[i][0].length == 1) {
                result_array[i].push([result_array[i][1][0](subtext)]);
            } else {
                let str_array = [];
                for (let j = 0; j < result_array[i][0].length; j++) {
                    let index1 = result_array[i][2];
                    let index2 = subtext.match(new RegExp(result_array[i][0][j].source)).index + index1;
                    let index3 = subtext.match(new RegExp(result_array[i][0][j].source))[0].length + index2;
                    let index4 = result_array[i][3];
                    str_array.push(text.substring(index1, index2) + result_array[i][1][j](subtext.match(new RegExp(result_array[i][0][j].source))[0]) + text.substring(index3, index4));
                }
                result_array[i].push(str_array);
            }

        }
        //添加处理前的文本,索引5 // 0、1、2、3、4、5
        for (let i = 0; i < result_array.length; i++) {
            result_array[i].push(text.substring(result_array[i][2], result_array[i][3]));
        }
        //文本处理结果
        let final_text = "";
        for (let i = 0; i < result_array.length; i++) {
            if (result_array[i][0].length <= 1) {
                final_text = final_text + result_array[i][4][0];
            } else {
                final_text = final_text + '<a class="clashresulttampermonkey" title="正则冲突,点击显示多个处理结果" showbool="false" value="' + i + '">' + result_array[i][5] + '</a>';
            }
        }
        //打印结果
        // console.log("//hit_array");
        // console.table(hit_array);
        // console.log("//clash_array");
        // console.table(clash_array);
        // console.log("//result_array");
        // console.table(result_array);
        // console.log("//final_text");
        // console.log(final_text);
        return [result_array, final_text];
    }

    function main() {
        //获取原简介内容
        let text = $("#v_desc > div.desc-info").text();
        let core_result = core(text,R);
        let result_array = core_result[0];
        let infotampermonkey = core_result[1];

        //添加a标签的颜色样式和鼠标悬浮颜色样式
        let infotampermonkeystyle =
            "<style>" +
            ".video-desc .infotampermonkey a {color: #00a1d6}" +
            ".video-desc .infotampermonkey a:hover {color: #f25d8e}" +
            "</style>";

        //准备一个div用于存放二维码图片
        let qrcode_div = '<div id="qrcodetampermonkey" style="border: 1px solid rgb(0, 161, 214); border-radius: 4px; z-index: 1001; position: absolute; top: 0px; left: -300px;"></div>';

        //准备一个div用于存放冲突的选项
        let clash_div = '<div id="clashtampermonkey" style="border: 1px solid rgb(0, 161, 214); border-radius: 4px; padding: 4px; background-color: rgba(255, 255, 255, 1); z-index: 1001; position: absolute; top: 0px; left: -300px;"></div>';

        //在旧简介div后添加一个新的简介div
        if ($("#v_desc > div.desc-infotampermonkey").length == 0) {
            $("#v_desc > div.desc-info").after('<div class="infotampermonkey" style="white-space: pre-line; overflow: hidden;">' + infotampermonkeystyle + qrcode_div + clash_div + infotampermonkey + '</div>');
        }

        //隐藏旧简介div
        //$("#v_desc > div.desc-info").hide(); //使用hide()用导致"展开更多"按钮消失
        //$("#v_desc > div.desc-info").css("height",0);//重新设置高度也会导致"展开更多"按钮消失
        $("#v_desc > div.desc-info").css({"position":"absolute","top":"-9999px","left":"-9999px"});
        //新简介使用和旧简介一样的元素高度
        $("#v_desc > div.desc-infotampermonkey").css("height", $("#v_desc > div.desc-info").css("height"));
        $("#v_desc > div.desc-infotampermonkey").css("width", $("#v_desc > div.desc-info").css("width"));

        //给需要显示二维码的元素添加鼠标悬浮显示二维码的效果
        $(".qrtampermonkey").hover(function () {
            let qrtext = $(this).attr("value");
            $("#qrcodetampermonkey").append(QR({ text: qrtext, fill: '#00a1d6', size: 100, ecLevel: 'L', rounded: 40 }));
            $("#qrcodetampermonkey").css({ "top": $(this).position().top + $(this).height(), "left": $(this).position().left + $(this).width() });
            $("#qrcodetampermonkey").show();
        }, function () {
            $("#qrcodetampermonkey").hide();
            $("#qrcodetampermonkey").empty();
        });

        //给需要修改视频时间的元素添加点击事件
        $(document).on("click", ".timetampermonkey", function () {
            let time = $(this).attr("value");
            $("video")[0].currentTime = time;
        });

        //给需要触发复制的元素添加点击事件
        $(document).on("click", ".copytampermonkey", function () {
            let copy_text = $(this).attr("value");
            GM_setClipboard(copy_text);

            $(this).after('<a id="alert_after_copy" style="color:black;">(已复制)</a>');
            setTimeout(function () {
                $("#alert_after_copy").remove();
            }, 2500)
        });

        //给需要触发冲突的元素添加点击事件
        $(document).on("click", ".clashresulttampermonkey", function () {
            let index = $(this).attr("value");
            let clash_array = result_array[index];
            if($(this).attr("showbool")=="false"){
                $(this).attr("showbool","true");
                for(let i=0;i<clash_array[0].length;i++){
                    $("#clashtampermonkey").append(clash_array[4][i] + "<br>");
                }
                $("#clashtampermonkey").css({ "top": $(this).position().top + $(this).height(), "left": $(this).position().left + $(this).width() });
                $("#clashtampermonkey").show();
            }else if($(this).attr("showbool")=="true"){
                $(this).attr("showbool","false");
                $("#clashtampermonkey").hide();
                $("#clashtampermonkey").empty();
            }
        });
    }

    function debounce(fn, delay) {
        delay = delay || 10;
        let handle;
        return function (e) {
            clearTimeout(handle);
            handle = setTimeout(() => {
                fn(e);
            }, delay);
        }
    }



    $(document).on("DOMNodeInserted", "#v_desc > div.desc-info", debounce(main));
    //给"展开更多"、"收起"按钮添加点击事件,让按钮可以像控制旧简介div高度一样控制新简介div高度
    let flag = true;//显示"展开更多"就是true,默认就是true
    $(document).on("click", "#v_desc > div.btn", function () {
        if (flag) {
            $("#v_desc > div.desc-infotampermonkey").css("height", "auto");
            flag = false;
        } else {
            $("#v_desc > div.desc-infotampermonkey").css("height", "63px");
            flag = true;
        }
    });

    //点击其他位置时关闭冲突弹窗
    $(document).click(function(){
        if (event.target.className !== "clashresulttampermonkey") {
            $(".clashresulttampermonkey").attr("showbool","false");
            $("#clashtampermonkey").hide();
            $("#clashtampermonkey").empty();
        }
    });



})();

//搜索框占行
//搜索...:                                                                       □ .* □ Aa   查找下一个   查找上一个   关闭