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); }); })();
额外说明
- 新增
xhr.onerror错误处理,方便排查请求失败情况; - 用
link.href替代原代码中传递DOM元素给xhr.open的错误写法,确保传递的是URL字符串; - 添加
matchResult非空判断,避免匹配失败时出现Cannot read property '1' of null报错; - 变量名优化为语义化命名,提升代码可读性。
内容的提问来源于stack exchange,提问作者medic_dev
相关产品推荐
相关产品推荐

