如何通过UserScript从页面文本中提取函数调用的参数?
解决方案:定位纯文本中的函数调用并提取参数
没问题,我来一步步帮你搞定这个需求!既然目标函数调用是页面里的纯文本(不在DOM元素范围内,还因为屏蔽其他脚本没法直接通过JS上下文访问),那我们可以通过页面纯文本抓取+正则匹配的方式来完成定位和参数提取。
1. 定位调用函数的字符串并赋值变量
首先我们需要获取整个页面的纯文本内容,然后用正则表达式匹配包含目标函数名的调用语句。这里的关键是写一个适配你目标函数的正则——如果是部分匹配函数名,就用模糊匹配的规则。
代码示例:
// 第一步:获取整个页面的纯文本内容 const pageFullText = document.documentElement.textContent; // 第二步:编写正则匹配目标函数调用 // 假设你要找的函数名包含"targetFunc",可以根据实际情况调整正则: // - 把"targetFunc"换成你的目标函数的部分名称 // - 加上/s标志是为了匹配跨换行的函数调用 const funcCallPattern = /targetFunc.*?\(([^)]+)\)/s; const matchedResult = pageFullText.match(funcCallPattern); if (matchedResult) { // 匹配到的完整函数调用字符串(比如"targetFunc('param1', 2, {key: 'val'})") const fullFunctionCall = matchedResult[0]; console.log("找到目标函数调用:", fullFunctionCall); } else { console.log("未找到符合条件的函数调用,请检查正则是否匹配目标函数名"); }
注意点:
- 如果页面里有多个匹配结果,可以用
matchAll()来遍历所有匹配项:for (const match of pageFullText.matchAll(funcCallPattern)) { console.log("找到的函数调用:", match[0]); } - 如果函数名的匹配需要更精准(比如区分大小写、避免误匹配其他类似函数),可以调整正则的修饰符(比如
i忽略大小写)或者增加上下文匹配规则。
2. 从匹配结果中提取参数
提取参数的难度取决于参数的复杂程度——如果是简单的逗号分隔值,直接分割即可;如果参数包含带逗号的字符串、嵌套对象/数组,就需要更健壮的正则来处理。
场景1:简单参数(无嵌套、无带逗号的字符串)
这种情况直接分割参数部分即可,再做一些类型解析:
if (matchedResult) { // 获取括号内的参数字符串(比如"'param1', 2, {key: 'val'}") const paramsRawStr = matchedResult[1]; // 分割参数并去除首尾空格 const rawParams = paramsRawStr.split(',').map(param => param.trim()); // 可选:将参数解析为对应的数据类型 const parsedParams = rawParams.map(param => { // 处理带引号的字符串(单/双引号) if ((param.startsWith('"') && param.endsWith('"')) || (param.startsWith("'") && param.endsWith("'"))) { return param.slice(1, -1); } // 处理数字类型 if (!isNaN(Number(param))) { return Number(param); } // 其他情况(比如对象字面量、变量名)返回原字符串 return param; }); console.log("解析后的参数:", parsedParams); }
场景2:复杂参数(带逗号的字符串、嵌套对象/数组)
如果参数里有类似"hello, world"这样带逗号的字符串,直接用split(',')会把一个参数拆成两个,这时候需要用更精准的正则来匹配每个参数:
if (matchedResult) { const paramsRawStr = matchedResult[1]; // 匹配参数的正则:跳过引号内的内容,处理嵌套括号 const paramItemPattern = /(?:[^,"']|"(?:\\.|[^"])*"|'(?:\\.|[^'])*'|\([^)]*\))+/g; const rawParams = paramsRawStr.match(paramItemPattern)?.map(param => param.trim()) || []; console.log("精准提取的参数:", rawParams); // 之后可以再对每个参数做类型解析,逻辑和场景1一致 }
额外提示:
如果参数是复杂的对象字面量,你可以尝试用eval()或者new Function()来解析,但注意风险——因为是页面纯文本,可能包含恶意代码,所以一定要确保目标参数是安全的再使用。比如:
// 仅在确认参数安全的情况下使用! const objParam = eval(`(${rawParams[2]})`);
内容的提问来源于stack exchange,提问作者dementialover
相关产品推荐
相关产品推荐

