You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TamperMonkey脚本正则匹配提取分组问题求助

问题分析与解决方案

核心问题1:异步请求时机错误

你的代码里XHR是异步执行的,调用xhr.send(null)后立刻执行title = evidence.match(...),此时请求还未完成,evidence还是初始空字符串,自然匹配不到内容。必须把正则匹配和后续更新操作放到xhr.onload回调内部,确保拿到响应后再处理。

核心问题2:正则表达式转义错误

代码中的\"是HTML实体的转义写法,但XHR获取的响应文本里,实际双引号应为"而非"。修正后的正则直接匹配双引号即可:

const regexPattern = /portfolio-item__text-input-wide" .*value="(.+)"/;

若担心双引号冲突,也可用模板字符串包裹:

const regexPattern = new RegExp(`portfolio-item__text-input-wide" .*value="(.+)"`);

核心问题3:循环作用域污染

用var i遍历数组时,异步回调会共享同一个i变量,最终所有回调都会指向最后一个元素。换成let i或直接用forEach遍历更安全。

核心问题4:捕获分组提取方法

String.match(regex)匹配成功后返回数组:第一个元素是整个匹配字符串,后续元素是各捕获组内容。你需要的标题是第一个捕获组,即matchResult[1],同时要处理匹配失败的情况,避免null报错。


修正后的完整代码

// ==UserScript==
// @name         Pull through titles
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  Extract evidence titles and update links
// @author       You
// @match        https://xxx/curriculum-overview/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const regexPattern = /portfolio-item__text-input-wide" .*value="(.+)"/;

    // Show descriptors by default
    const descriptors = document.getElementsByClassName("js-descriptors");
    for (let i = 0; i < descriptors.length; i++) {
        descriptors[i].style.display = "block";
    }

    // Find all evidence links
    const urls = document.querySelectorAll('a[href*="portfolio-item/review"]');

    // Process each link with forEach to avoid scope issues
    urls.forEach(link => {
        const xhr = new XMLHttpRequest();
        xhr.open("GET", link.href, true);
        xhr.responseType = "text";

        xhr.onload = () => {
            if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
                const response = xhr.responseText;
                const matchResult = response.match(regexPattern);
                
                if (matchResult && matchResult[1]) {
                    // 提取第一个捕获组的内容作为标题
                    const title = matchResult[1];
                    // 更新链接文本
                    link.innerText = title;
                } else {
                    console.warn("未匹配到标题内容", link.href);
                }
            }
        };

        xhr.onerror = () => {
            console.error("请求失败", link.href);
        };

        xhr.send(null);
    });
})();

额外说明

  1. 新增xhr.onerror错误处理,方便排查请求失败情况;
  2. 用link.href替代原代码中传递DOM元素给xhr.open的错误写法,确保传递的是URL字符串;
  3. 添加matchResult非空判断,避免匹配失败时出现Cannot read property '1' of null报错;
  4. 变量名优化为语义化命名,提升代码可读性。

内容的提问来源于stack exchange,提问作者medic_dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:05:27