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

如何用正则表达式精准检测URL子域名?Chrome扩展实现问题

Chrome扩展域名匹配问题

我正在开发一款Chrome扩展,需要实现域名列表与标签页当前URL的精准匹配,规则如下:

  • 若列表中有google,需识别docs.google.com属于匹配项;
  • 若列表中有docs.google,则google.com不应被识别为匹配项。

目前域名匹配功能正常,但子域名匹配存在问题。已按照建议修改正则表达式,问题仍未解决,附上相关JavaScript代码:

let onDomainList = false;
for(let i = 0; i < domainListLength-1; i++){
                if(!domainList[i].includes(".")){ //if this domain is not a subdomain
                    let strPattern = "^https://www\\." + list.domainList[i].replace(/[-\\/\\^$*+?.()|[\]{}]/g, '\\$&') + "|https://[a-z_]+\\." + list.domainList[i].replace(/[-\\/\\^$*+?.()|[\]{}]/g, '\\$&');
                    let domainRegEx = new RegExp(strPattern,'i');
                    if(domainRegEx.test(activeTab.url)){
                        onDomainList = true;
                        execute_script(activeTab);
                    }
                } else{ //if this domain is a subdomain
                    let strPattern = "^https://www\\." + list.domainList[i].replace(/[-\\/\\^$*+?.()|[\]{}]/g, '\\$&');
                    let domainRegEx = new RegExp(strPattern,'i');
                    if(domainRegEx.test(activeTab.url)){
                        onDomainList = true;
                        execute_script(activeTab);
                    }
                }
            }

问题分析与修复方案

你的代码存在几个关键问题:

  1. 循环边界错误:i < domainListLength-1会漏掉最后一个域名项,应该改成i < domainListLength;
  2. 子域名匹配逻辑不全:当前规则只匹配www.xxx.yyy的情况,但实际URL可能不带www,比如https://docs.google.com无法被列表中的docs.google匹配;
  3. 正则表达式结构缺陷:缺少对域名后缀的边界限制,同时没有处理URL中可能存在的路径部分。

修改后的代码如下:

let onDomainList = false;
const url = new URL(activeTab.url); // 用URL API解析,避免手动处理复杂URL结构
const hostname = url.hostname;

for (let i = 0; i < domainListLength; i++) {
    const target = list.domainList[i];
    if (!target.includes(".")) {
        // 匹配顶级域名的任意子域名(如google匹配xxx.google.com、google.com)
        const regex = new RegExp(`(^|\\.)${target}\\.`, 'i');
        if (regex.test(hostname)) {
            onDomainList = true;
            execute_script(activeTab);
        }
    } else {
        // 匹配精确的子域名前缀(如docs.google匹配docs.google.com,但不匹配google.com)
        const regex = new RegExp(`^${target}\\.`, 'i');
        if (regex.test(hostname)) {
            onDomainList = true;
            execute_script(activeTab);
        }
    }
}

修复说明

  • 使用URLAPI直接提取hostname,避开http/https、路径等干扰项,匹配更可靠;
  • 顶级域名匹配:(^|\\.)${target}\\.确保target作为主域名存在,比如google会匹配google.com、docs.google.com,但不会误匹配googlefake.com;
  • 子域名匹配:^${target}\\.确保target是域名的前缀部分,比如docs.google只会匹配docs.google.com,不会匹配google.com或多级子域名(若需匹配多级可调整正则为(^|\\.)${target}\\.);
  • 修正循环边界,确保遍历所有域名项。

内容的提问来源于stack exchange,提问作者Jonnes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:54:17