match、include、exclude 三种页面匹配写法的区别
「脚本装了为什么不在这个页面跑」「为什么会跑到意想不到的页面」——八成出在匹配规则上。官方文档对 @match 与 @include 有分条说明,两者的匹配逻辑并不相同。
@match:结构化匹配(推荐)
@match 按 URL 结构分段匹配:
// @match <协议>://<域名><路径>
- 协议:
http、https,或*(两者都匹配); - 域名:精确域名,可用
*.example.com同时匹配主域与所有子域; - 路径:域名后的部分,
*匹配任意内容。
官方给出的示例:
// @match *://*/*
// @match https://*/*
// @match http://*/foo*
// @match https://*.example.net/foo*bar
注意:Chrome 的 <all_urls> 写法在 Tampermonkey 里不支持,协议段也接受 http*://。
@include:通配匹配(宽松)
@include 是更老的传统写法,对含 :// 的值做特殊解释:
// @include https://www.example.com/*
// @include /^https:\/\/www\.example\.com\/.*$/ // 也支持正则
官方特别提醒的坑:写 *://example.net/* 时,很多人以为只匹配 example.net,实际它还会匹配参数里带这个网址的其他页面。为此 Tampermonkey 对含 :// 的 include 做了类似 match 的收窄解释::// 前的 * 只匹配协议,中间的主机段不会跨越斜杠。
一句话结论:match 是精确的结构匹配,include 是历史兼容、行为更宽的写法。新写脚本优先 @match。
@exclude:从范围里剔除
@exclude 把页面从命中范围里剔除,可写多条:
// @match https://www.example.com/*
// @exclude https://www.example.com/login*
上面组合的含义:全站运行,但登录页不跑。
改别人的脚本范围
不想动代码、只想临时收窄/放宽某个脚本的命中范围,用编辑器 Settings 标签的用户排除/用户包含,见脚本设置页。
排查匹配问题的顺序
- 管理面板点脚本名 → Settings 标签看原始规则原文;
- 对照本页通配规则逐段核对当前网址;
- 仍不命中时检查允许用户脚本开关与 Site Access。