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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:01:53