使用正则表达式将不推荐使用的@include 转换为用户脚本中的@match

Convert deprecated @include with regular expression to @match in userscript

Tampermonkey 在我的用户脚本的 @include 语句中有弃用警告:

// @include /https\:\/\/([a-z\.]*\.)?(((stackexchange|askubuntu|superuser|serverfault|Whosebug|stackapps)\.com)|(mathoverflow\.net))\/.*/
// @exclude /^https://(chat|api|data)\./
// @exclude https://stackexchange.com/*

eslint: userscripts/better-use-match - Using @include is potentially unsafe and may be obsolete in Manifest v3 in early 2023. Please switch to @match.

documentation for @match 说:

More or less equal to the @include tag. You can get more information here. Note: the <all_urls> statement is not yet supported and the scheme part also accepts http*://.

Multiple tag instances are allowed.

然而,尽管这些文档的帮助不大,但它们根本不等同。这不起作用:

// @match /https\:\/\/([a-z\.]*\.)?(((stackexchange|askubuntu|superuser|serverfault|Whosebug|stackapps)\.com)|(mathoverflow\.net))\/.*/

here link 根本没有提到正则表达式!如何将此正则表达式转换为在 @match 中工作?

@match 根本不支持正则表达式,它只支持 globbing。您需要将正则表达式转换为多个 glob。

@match 的处理方式是将指令分成三部分,并分别针对 URL 的各个部分进行匹配:

// @match PROTOCOL://HOSTNAME/PATH

这与 include 不同,include 指令与整个 URL 相匹配。看:

// @include https://*.example.com/* 有一个潜在的安全漏洞,因为攻击者可以制作一个 URL 像 https://attacker.example/?.example.com 这样允许您的用户脚本在攻击者的域上 运行。根据您的用户脚本的作用,它可能允许攻击者恶意使用您的脚本来窃取您的用户的数据、攻击您的用户或将他们用作 DDOS 的一部分。

如果您的正则表达式在几个不同的域之间进行选择,您将需要将 @include 正则表达式分解为许多 @match 带有 glob 的指令。请注意,在匹配主机名时,*.whosebug.com 匹配没有子域的 whosebug.com

// @match https://*.stackexchange.com/*
// @match https://*.whosebug.com/*
// @match https://*.askubuntu.com/*
// @match https://*.superuser.com/*
// @match https://*.serverfault.com/*
// @match https://*.mathoverflow.net/*
// @match https://*.stackapps.com/*
// @exclude /^https://(chat|api|data)\./
// @exclude https://stackexchange.com/*

因为 glob 的表达能力不如正则表达式,一些 @include 指令将 无法表达为 @match。如果您使用正则表达式来匹配站点上非常具体的 URL 路径,您可能必须将用于确定您的用户脚本是否应该 运行 在特定路径上的逻辑移动到 @exclude 规则或您的脚本本身。

对主机名的 globbing 也有新的限制。通配符 必须 位于开头,并且 必须 后跟 .。因此匹配所有 TLD 与 example.* 是不可能的,匹配部分域名如 *example.com 也是不可能的。有关详细信息,请参阅 Google's documentation for match patterns

注意: 如果您之前使用的是 @exclude 指令,则无需对它们进行任何更改。 @exclude 指令没有被弃用。因为它 排除 域,而不是 包含 它们,所以 @exclude 引入安全漏洞的可能性要小得多。